2009-09-01 8 views
1

J'essaie de créer un arbre d'expression de manière dynamique.Linq jointure interne de regroupement

Laissez Asume que j'ai deux classes simples:

class CustomerType 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public OrderType[] Orders { get; set; } 
} 

class OrderType 
{ 
    public int Id { get; set; } 
    public DateTime Date { get; set; } 
    public decimal Price { get; set; } 
} 

.. et types d'entités correspondants sans les associations (donc, je dois utiliser se joindre à une coutume).

J'ai besoin de remplir une liste de clients avec les ordres correspondants. Je sais qu'il y a deux types de jointures dans Linq: Left Outer Join et Left Inner Join.

Ainsi, en utilisant une gauche OUTER JOIN Je peux écrire la requête suivante (pour simplifier, je vais illustrer la question en utilisant une expression Linq au lieu d'un code de générateur de ExpressionTree personnalisé):

var query = from c in db.Customers 
      join o in db.Orders on c.Id equals o.CustomerId into g 
      select new AccountType() 
      { 
       Id = c.Id, 
       Name = c.Name, 
       Orders = g 
      }; 

Ainsi, une propriété de commandes de l'objet AccountType contiendra toutes les commandes correspondantes. Je ne comprends pas comment je peux utiliser une jointure interne gauche pour obtenir le même résultat avec la filtration, en fonction des champs de la table des ordres (par exemple, je dois interroger tous les clients qui ont une commande avec le prix plus élevé que 100.00):

var query = from c in db.Customers 
      join o in db.Orders on c.Id equals o.CustomerId 
      where o.Price > 100.00 
      select new AccountType() 
      { 
       Id = c.Id, 
       Name = c.Name, 
       Orders = ??? 
      }; 

Merci pour l'aide!

+0

Ce que vous appelez une « jointure externe gauche » est en fait appelé une "jointure de groupe" à Linq. Linq n'est pas SQL et les concepts SQL ne se traduisent pas directement en Linq. –

+0

Merci pour la correction. – junglit

Répondre

2

je le ferais comme ça:

var query = from c in db.Customers 
      join o in db.Orders on c.Id equals o.CustomerId into g 
      select new AccountType() 
      { 
       Id = c.Id, 
       Name = c.Name, 
       Orders = g.Where(o => o.Price > 100.00) 
      }; 

Avec une jointure, vous devez utiliser une group by clause:

var query = from c in db.Customers 
      join o in db.Orders on c.Id equals o.CustomerId 
      where o.Price > 100.00 
      group o by c into g 
      select new AccountType() 
      { 
       Id = g.Key.Id, 
       Name = g.Key.Name, 
       Orders = g 
      } 
+0

Merci beaucoup pour votre aide! L'exemple du "groupe par" est ce dont j'ai besoin. – junglit

Questions connexes