2009-09-01 67 views
1

我试图动态地创建表达式树。Linq内连接分组

让asume我有两个简单的类:

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; } 
} 

..和相应的实体类型没有任何关联(所以,我需要使用自定义的连接)。

我需要使用相应的订单来填充客户列表。 我知道在Linq中有两种连接:左外连接和左内连接。

因此,使用左外连接我可以写出如下的查询中(为了简化,我将使用LINQ表达式而不是自定义ExpressionTree发生器代码说明的问题):

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 
      }; 

所以,一个订单属性AccountType对象将包含所有对应的订单。

我只是不明白如何使用左内部联接来获得与过滤相同的结果,基于订单表字段(例如,我需要查询所有订单的价格更高的客户比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 = ??? 
      }; 

感谢您的帮助!

+0

你所谓的“左外连接”实际上是调用Linq的“团队合作”。 Linq不是SQL,SQL概念不直接转换成Linq。 – 2009-09-01 09:52:10

+0

谢谢你的纠正。 – junglit 2009-09-01 10:51:28

回答

2

我会做这样的:

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) 
      }; 

随着内部联接,你将不得不使用一个group by条款:

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

非常感谢您的帮助! “由...组成”的例子就是我需要的。 – junglit 2009-09-01 10:49:15