2010-02-24 4 views
4

Avec la requête ci-dessous, je fais plusieurs jointures et je les sélectionne toutes. Je veux renvoyer ce résultat dans une liste, donc dans ce cas, j'aurais une liste avec un compte de trois, en supposant qu'il y ait trois adresses associées à cet ordre d'identifiant de client unique ... En ce moment la requête fonctionne mais je mets exp .ToList() il me donne essentiellement une liste 2d (une liste avec un seul élément dans lequel cet élément est une liste de type de 3 éléments.Il est sûr qu'il y a un bon moyen de le faire ... pensées?Plusieurs jointures dans une liste

var exp = (

     from t in this.reposOrders.All() 

     join p1 in this.reposAddress.All() 
     on t.AddressPrimary equals p1.AddressID into pp1 
     from p1 in pp1.DefaultIfEmpty() 

     join p2 in this.reposAddress.All() 
     on t.AddressSecondary equals p2.AddressID into pp2 
     from p2 in pp2.DefaultIfEmpty() 

     join p3 in this.reposAddress.All() 
     on t.AddressThird equals p3.AddressID into pp3 
     from p3 in pp3.DefaultIfEmpty() 

     where t.CustomerID == customerID 

     select new { p1, p2, p3 } 
    ); 

Répondre

0

Qu'est-ce que vous voulez faire souffre de normalisation pauvres? AddressPrimary, AddressSecondary et AddressThird ne doit pas être des champs d'ordres (je suppose ordre de yo ur line from t in this.reposOrders.All()), mais devrait être contenue dans une entité faible ou une table de jointure.

Cela dit, vous pouvez probablement obtenir ce que vous voulez avec la requête suivante:

var primary = from t in this.reposOrders.All() where t.CustomerID == customerID select t.AddressPrimary; 
var secondary = from t in this.reposOrders.All() where t.CustomerID == customerID select t.AddressSecondary; 
var tertiary = from t in this.reposOrders.All() where t.CustomerID == customerID select t.AddressThird; 
var ids = primary.Union(secondary).Union(tertiary); 
var addresses = from a in this.reposAddress.All() where ids.Contains(a.AddressID) select a; 
+0

Merci pour vos critiques de la normalisation, mais je suis en désaccord. – Gabe

+0

Cela a été mal formulé de ma part, désolé. Bien que je crois qu'il serait préférable d'utiliser une table de jointure. Avez-vous essayé l'approche que j'ai exposée? Il regroupe essentiellement vos adresses primaires, secondaires et tertiaires en une seule liste d'ID, qui est ensuite interrogée pour obtenir les adresses souhaitées. Comme LINQ est une exécution déferrée, vous ne passerez pas en revue les itérations jusqu'à ce que vous appeliez ToList(). – Randolpho

Questions connexes