2010-10-22 3 views
0

ont besoin d'aide pour accomplir cela dans linq.Linq en C# Requête nécessaire - Une à plusieurs relations de table, un à plusieurs enregistrements requis

J'ai 3 tables.

  1. Les clients

  2. CustumerOrder

  3. OrderDetails

Je dois à la liste dans une requête à tous les clients (seulement si elles ont placé atleast un ordre) avec toutes les commandes pour chaque client uniquement si la valeur de la commande est supérieure à 100.

Cordialement,

Rude

+2

Veuillez ajouter plus de détails que les noms des tables. Par exemple, les colonnes. Encore mieux, puisqu'il s'agit de LinqToSql, fournissez vos noms de classe/propriété à la place. –

+0

Salut Kirk, Disons qu'il ya ci-dessous des colonnes - 1. Clients - CustomerId, CustomerName 2. CustomerOrder - OrderId, CutomerId, OrderAmount 3. OrderDetails - OrderId, OrderDate ...... Maintenant, s'il vous plaît laissez-moi savoir comment puis-je obtenir le collection comme Dictionary > en utilisant Linq query ....... Espérons que cela soit très explicatif. Ceci est juste client commun, scénario de commande, vous pouvez assumer les autres détails selon le scénario. –

Répondre

0

Je dirais que vous voulez quelque chose comme ceci:

from c in Customers 
where c.CustomerOrders.Any() 
select new 
{ 
    customer, 
    Orders = 
    from co in c.CustomerOrders 
    where co.TotalPrice > 100 
    select co.OrderDetails 
} 

Ou, si vous ne N'ayez pas une colonne "TotalPrice" dans la table CustomerOrder, remplacez la requête interne par ceci:

Orders = 
    from cp in c.CustomerOrders 
    where co.OrderDetails.Sum (od => od.Price) > 100 
    select co.OrderDetails 

Edit: si vous voulez inclure les clients uniquement avec au moins un ordre avec OrderTotalPrice plus de 100, utilisez un nous déclaration:

from c in Customers 
let highValueOrders = 
    from co in c.CustomerOrders 
    where co.TotalPrice > 100 
    select co.OrderDetails 
where highValueOrders.Any() 
select new 
{ 
    customer, 
    highValueOrders 
} 

Vous pouvez ajouter d'autres conditions de la même façon.

+0

Merci beaucoup à tous. J'apprécie vraiment cette réponse rapide. Mais cette requête ne prend pas en considération la partie qui - client serait dans la liste finale que s'il a atleast un ordre avec OrderTotalPrice plus de 100 + En fait, j'eu quelques conditions ici pour l'inclusion du Client dans la sélection finale comme - Sélectionnez le Client seulement s'il a au moins une commande avec Age> 30 si le Client est de type "Régulier" ou Age> 35 si le Client est de type "Rare". CustomerType est stocké dans la table CustomerDetails. S'il vous plaît me aider .. Cordialement, Harshal –

+0

Merci beaucoup Joe .. Quelques questions - 1. Peut-on appeler C# fonctions contenues dans la requête LINQ ou expression Lambda?J'ai besoin de ceci pour calculer l'âge, dans ma base de données il y a un champ d'anniversaire et j'aurais besoin d'un âge pour être calculé de ce champ 2. Comment puis-je obtenir la liste de dessus la question LINQ, maintenant je n'ai besoin que des clients plus de nombre de lignes woth Détails du client. Je suis vraiment confus ici. Ne sais pas comment puis-je transmettre cela à l'interface utilisateur. Puis-je obtenir quelque chose comme Dictionary >? –

+0

Vous ne pouvez pas appeler vos propres fonctions dans les expressions lambda qui passent par un pipeline L2S ou EF. Pour une solution de contournement, consultez ceci: http://mathgeekcoder.blogspot.com/2008/07/advanced-domain-model-queries-using.html –

0

Voici une estimation basée hors des hypothèses:

var result = 
    from customer in Customers.Where(a => a.CustomerOrder.Count > 0) 
    from order in CustomerOrder.Where(a => a.OrderDetails.Sum(b => b.Price) > 100) 
    select new 
    { 
     customer, 
     order.OrderDetails 
    } 
Questions connexes