Voici une requête LINQ simple (basée sur NorthWind) qui renvoie une liste de clients. Chaque client contient une liste de commandes.Requêtes hiérarchiques dans LINQ
from c in Customers
join o in Orders on c.CustomerID equals o.CustomerID into CO
select new {c, CO}
Cela fonctionne très bien et le SQL généré est également bon. Maintenant, je veux aller un peu plus loin. Je veux que chaque objet Order contienne une liste de OrderDetails. J'utilise la requête suivante:
from c in Customers
join od in (
from o in Orders
join od in OrderDetails on o.OrderID equals od.OrderID into OD
select new { o.CustomerID, o, OD }
)
on c.CustomerID equals od.CustomerID into COD
select new { c, COD }
Cette requête fonctionne mais génère un code SQL horrible. Une requête distincte est émise pour chaque client. Lorsque vous regardez le code lambda, nous avons:
Customers
.GroupJoin (
Orders
.GroupJoin (
OrderDetails,
o => o.OrderID,
od => od.OrderID,
(o, OD) =>
new
{
CustomerID = o.CustomerID,
o = o,
OD = OD
}
),
c => c.CustomerID,
od => od.CustomerID,
(c, COD) =>
new
{
c = c,
COD = COD
}
)
Les GroupJoins imbriquées semblent être la cause des multiples stataments SQL. Cependant, j'ai essayé différentes combinaisons sans succès. Des idées?
EDIT: J'ai peut-être été un peu peu clair sur ce que j'essayais de réaliser. Je veux que l'objet OrderDetail soit une propriété de l'objet Order, qui est à son tour une propriété de l'objet Customer. Je ne veux pas que l'Order & OrderDetail soit une propriété du Client. J'essaie d'obtenir la liste des clients uniques. Pour chaque client, je m'attends à une liste de commandes et pour chaque commande, je veux une liste de OrderDetails. Je souhaite que la hiérarchie soit plus profonde que ma requête initiale.
Bien que je pense que cette requête pourrait être post-traitement pour obtenir ce dont il a besoin, la question initiale implique qu'il veut un seul résultat par 'Client', où chaque résultat contient une liste de' OrderDetails'. – jeremyalan