2009-09-02 5 views
-1

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?

+0

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? –

+0

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. –

+0

Fermé à la demande de l'OP en raison d'un problème localisé. – Kev

Répondre

0

Ça me semble que quelqu'un pourrait avoir un verrou. Pendant l'exécution de la requête, exécutez sp_who2 sur votre serveur. Y a-t-il quelque chose qui bloque la requête?

+0

Oui, soit un verrou ou une base de données fonctionnant mal pour une raison quelconque. La requête fonctionne par intermittence et je suis incapable d'obtenir une explication raisonnable de DBA. Pas aussi intéressant que j'ai d'abord pensé! –

Questions connexes