LINQ内部联接分组 [英] Linq inner join grouping
本文介绍了LINQ内部联接分组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试动态创建表达式树。
假设我有两个简单的类:
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
}
这篇关于LINQ内部联接分组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文