2010-07-22 3 views
0

J'utilise .NET 4 et VS 2010 et ont le même problème dans .NET 3.5/VS 2008Sélection multiple un à plusieurs relations dans LINQ to SQL en utilisant des jointures externes

La structure:
Tableau 1: appelez
Tableau 2: AddressChangeRequest
Tableau 3: CallNotes

Un seul appel peut avoir plusieurs AddressChangeRequests et beaucoup CallNotes. Un client (customerKey) peut avoir plusieurs appels.

Le code LINQ.
retour db.Calls.Where (c => c.CustomerKey == '...') Sélectionner ( c => nouvel appel (c.CustomerKey, c.StartTime, c .AddressChangeRequests, c.CallNotes));

Appel est un objet de domaine qui attend une liste de AddressChangeRequests et CallNotes. Le code renvoie une liste d'appels comme prévu, mais le SQL n'est pas optimal.

Le code ci-dessus génère SQL comme un SELECT de la table d'appel avec une jointure externe gauche sur la table AddressChangeRequest suivie par des requêtes SELECT séparées de la table CallNote (un pour chaque appel associé)

Select ... from Call as c 
LEFT OUTER JOIN AddressChangeRequest as acr ON c.id = acr.callId 

Select ... from CallNote Where callId = 123 
Select ... from CallNote Where callId = 456 
Select ... from CallNote Where callId = 789 

Si Je supprime AddressChangeRequests du code, une jointure externe gauche est générée pour la table CallNote et les instructions Select individuelles ne sont plus générées.

Ma question est, en utilisant LINQ comment puis-je générer une seule instruction SQL comme suit:

Select ... from Call as c 
LEFT OUTER JOIN AddressChangeRequest as acr ON c.id = acr.callId 
LEFT OUTER JOIN CallNote as cn ON c.id = cn.callId 
+0

En supposant que LINQtoSQL et que vous utilisez DataLoadOptions.LoadWith? – Marc

+0

Oui à LINQtoSQL et oui j'ai essayé avec DataLoadOptions.LoadWith sur CallNote et AddressChangeRequest, l'activation ou la désactivation ne fait pas de différence. Merci pour votre commentaire, d'autres idées? – kforbesie

Répondre

0

La réponse est malheureusement « non ». Le support de chargement impatient de L2S est primitif. Vous pouvez cependant créer votre propre version en plus des fonctionnalités de requête standard.

Questions connexes