LINQ内部联接分组

人气:674 发布:2022-10-16 标签: linq grouping inner-join

问题描述

我正在尝试动态创建表达式树。

假设我有两个简单的类:

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中有两种联接:左外联接和左内联接。

因此,使用LEFT OUTER JOIN,我可以编写以下查询(为简化起见,我将使用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对象的Orders属性将包含所有相应的订单。

我只是不明白如何使用LEFT INTER JOIN根据ORDERS表字段进行过滤以获得相同的结果(例如,我需要查询订单价格大于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 = ???
            };

谢谢您的帮助!

推荐答案

我会这样做:

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
            }

708