2010-04-01 4 views
2

je dois faire la chose suivante:LINQ to SQL: faire une plante "double IN" requête

var a = from c in DB.Customers 
     where (from t1 in DB.Table1 where t1.Date >= DataTime.Now 
       select t1.ID).Contains(c.ID) && 
       (from t2 in DB.Table2 where t2.Date >= DataTime.Now 
       select t2.ID).Contains(c.ID) 
     select c 

Il ne veut pas courir. Je reçois l'erreur suivante:

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

Mais lorsque je tente de courir:

var a = from c in DB.Customers 
     where (from t1 in DB.Table1 where t1.Date >= DataTime.Now 
       select t1.ID).Contains(c.ID) 
     select c 

Ou:

var a = from c in DB.Customers 
     where (from t2 in DB.Table2 where t2.Date >= DataTime.Now 
       select t2.ID).Contains(c.ID) 
     select c 

Il fonctionne! Je suis sûr que les deux requêtes IN contiennent des identifiants de clients.

Répondre

3

S'il s'agit d'un problème d'efficacité, il serait judicieux d'examiner la requête SQL produite par LINQ to SQL (en mode débogage, placez le curseur de la souris sur a). Dans tous les cas, vous pouvez essayer de réécrire la requête en utilisant join. Quelque chose comme ça devrait faire l'affaire:

var a = from c in DB.Customers 
     join t1 in DB.Table1 on c.ID equals t1.ID 
     join t2 in DB.Table2 on c.ID equals t2.ID 
     where t1.Date >= DateTimeNow && t2.Date >= DateTimeNow 
     select c 
+0

Je ne connaissais pas cette façon simple de déboguer LINQ to SQL! Je vous remercie. Il crée des requêtes EXISTS, et encore une fois, en prenant trop à charger. Si je n'utilise qu'un EXISTS, cela fonctionne. Je vais essayer de trouver où le problème est, ou utiliser des requêtes JOIN. Y a-t-il un moyen de faire en sorte qu'il utilise la requête IN au lieu de la requête EXISTS? – Alex

+0

J'ai trouvé le problème. C'est dans mon ordre NEWID() par méthode, parce que je veux obtenir des résultats aléatoires. Quand je l'enlève, ça fonctionne bien. Comment puis-je utiliser NEWID()? – Alex

1

Il ne s'agit pas nécessairement d'un plantage, mais plutôt d'une requête inefficace qui expire. Une bonne chose à faire est d'exécuter le SQL Server Profiler pour voir la requête réelle émise dans SQL, puis de faire une analyse à ce sujet.

0

J'ai trouvé le problème. C'est dans mon ordre NEWID() par méthode, parce que je veux obtenir des résultats aléatoires. Quand je l'enlève, ça fonctionne bien. Comment puis-je utiliser NEWID()?