【发布时间】:2019-08-08 12:47:20
【问题描述】:
我有两张桌子。一个名为Order 的表和一个名为OrderRows 的表。
Order 可以有零个或多个 OrderRows。
我想查询所有订单并为属于该Order 的所有 OrderRows 执行 Sum。
我是这样做的:
var model = await _dbContext.Orders
.Join(_dbContext.OrderRows, o => o.Id, or => or.OrderId, (o, or) => new {o, or})
.GroupBy(x => new
{
x.o.Id,
x.o.Name
})
.Select(g => new CustomDto
{
Id = g.Key.Id,
Name = g.Key.Name,
TotalPrice = g.Sum(x => x.wkr.Price)
}).ToListAsync();
这适用于所有具有 OrderRows 的订单。但是,有些订单(目前)还没有任何 OrderRows。
目前没有任何 OrderRows 的订单不包含在结果中。
在这些情况下,我仍然希望将它们包含在我的结果中,但使用 TotalPrice 或 0。
我必须在我的 Lambda 查询中进行哪些更改?
【问题讨论】:
-
您需要左连接。见这里:stackoverflow.com/a/21584913/809357
-
首先我建议使用导航属性。我假设
Orders有一个OrderRows属性,您可以使用而不是加入。 -
确实——从导航属性创建 JOIN 是 ORM 的工作。 LINQ 不是 SQL 的替代品,域实体也不是表。
-
有了适当的导航属性,你可以写
from order in Orders from row in order.Rows group row by order into g select new {g.Key.Id, g.Key.Name,Sum=g.Sum(x=>x.wkr.Price)} -
使用方法
Orders.SelectMany(order=>order.Rows).GroupBy(row=>row.Order).Select(g=>new {g.Key.Id,g.Key.Name,Sum=g.Sum(x=>x.wkr.Price)});写同样的东西