Il s'agit d'un étrange problème LINQ-to-SQL qui ne peut pas être évalué comme Enumerable (en SQL), mais je peux évaluer le côté client. Je pense que c'est lié à ma propriété binaire de test comme 'null'.LINQ-to-SQL Énumération avec Binary = null échoue
J'ai besoin de déterminer quand mon travail est terminé, ce qui signifie que tous les fichiers de ce travail ont au moins quelques données dans leur propriété FileContents binaire. La procédure consiste à trouver tous les fichiers pour un JobId donné, et si l'un de ces fichiers a FileContents = null alors le Job n'est pas encore terminé. Si tous les fichiers contiennent des fichiers, le travail est terminé.
La première tentative:
bool isJobComplete = !context.Files.Any
(f => f.JobId == this.JobId && f.FileContents == null);
ne fonctionne pas! Je reçois une exception SQL Timeout. J'ai aussi essayé d'autres variations sur la même chose et j'ai reçu le même résultat, par ex.
var filesInJob = context.Files.Where(f => f.JobId == this.JobId);
bool isJobComplete = !filesInJob.Any(jf => jf.FileContents == null);
La résolution est de récupérer une liste de tous les fichiers, puis vérifiez le côté client fileContents. C'est loin d'être idéal, car il m'arrive parfois d'avoir beaucoup de gros fichiers dans un Job.
List<File> filesInJob = context.Files.Where(f => f.JobId == this.JobId).ToList();
bool isJobComplete = !filesInJob.Any(jf => jf.FileContents == null);
Le SQL généré sur l'expression non-travail:
SELECT
<CASE
WHEN EXISTS<
SELECT NULL AS [EMPTY]
FROM [dbo].[File] as [t0]
WHERE <[t0].[JobId] = @p)> AND <[t0].[FileContents] IS NULL>
> THEN 1
ELSE 0
END> AS [value1]
Quelqu'un at-il une expérience de ce ou une explication des raisons pour lesquelles LINQ ne peut pas parler null à SQL?
EDIT:
Exécution SELECT TOP 1 * FROM [File] où [fileContents] IS NULL donne également un délai d'attente. Est-ce un problème où SQL ne peut pas effectuer de recherche sur les champs de type Binary? Si oui, existe-t-il une commande SQL qui fonctionnera avec ce scénario et comment pouvons-nous manipuler LINQ-to-SQL pour générer une telle commande?
Avez-vous essayé d'exécuter la requête générée par L2S dans SQL Management Studio? Avez-vous un délai d'attente là-bas? –
Bonne idée, et la réponse est oui. En fait, SELECT TOP 1 * FROM [Fichier] WHERE [FileContents] IS NULL donne également un délai. –
Fermé à la demande de l'OP en raison d'un problème localisé. – Kev