2009-11-12 1 views
2

Disons que j'ai 3 tables Posts, PostTags et Tags définissant une relation many-to-many. Je veux obtenir une table de consultation qui va me donner tous les postes liés à un tag donné donc j'utiliser le code suivant:Pourquoi ToLookup() dépend des options de chargement dans Linq2Sql?

return dataContext.PostTags.ToLookup(pt => pt.Tag, pt => pt.Post); 

Dans test unitaire tout est allé très bien, mais dans l'application réelle, il ne fonctionne pas . J'ai découvert que j'avais différentes options de chargement entre mon test unitaire et mon application.

Quand dataContext.DeferredLoadingEnabled = true;, tout va bien et fonctionne comme prévu, mais quand dataContext.DeferredLoadingEnabled = false; et vous n'avez pas les options de chargement PostTags-Post et Tag, la recherche de retour contient une seule touche (null) avec un tableau vide pour la valeur. Le SQL généré est

SELECT [t0].[PostID], [t0].[TagID] 
FROM [dbo].[PostTags] AS [t0] 

Alors, quand il génère la recherche, pt => pt.Post retours null et va de même pour les balises.

Pourquoi le fournisseur Linq2SQL ne peut-il pas générer le bon SQL dans ce cas?

Clarification: Par le droit SQL, tout SQL qui renverrait les bons objets Post et Tag et permettrait de les grouper correctement.

+0

En général, je reste loin de LoadOptions et de s'y tenir le chargement différé. Assez facile pour générer un SQL relativement rapide si nécessaire de ce point de vue. – leppie

+0

Maintenant que nous avons utilisé loadoptions dans notre application, je ressens la même chose que vous faites à leur sujet. Malheureusement, il est trop tard pour changer la façon dont l'application entière fonctionne. Dans le prochain projet, vous pouvez être certain que je vais convaincre mes collègues des avantages du chargement différé. –

Répondre

1

je trouve un moyen de le faire fonctionner quelle que soit la valeur de la propriété DeferredLoadingEnabled est et quelles que soient les loadoptions sont:

var lookup = (from pt in dataContext.PostTags 
       select new {pt.Post, pt.Tag}).ToLookup(x => x.Tag, x => x.Post); 
+0

L'équipe de Microsoft semble penser que c'est le comportement souhaité: http://social.msdn.microsoft.com/Forums/en-CA/netfxbcl/thread/b3c13f39-6173-4348-9036-76e8a57a6f4a J'ai accepté ma propre réponse avec une solution de contournement. –

Questions connexes