【问题标题】:Lambda left join with rows带行的 Lambda 左连接
【发布时间】: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 的订单不包含在结果中。

在这些情况下,我仍然希望将它们包含在我的结果中,但使用 TotalPrice0

我必须在我的 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)});写同样的东西

标签: c# .net linq lambda


【解决方案1】:

您可以使用简单的Select 而不进行分组。只需将TotalPrice 计算为子查询:

var model = await _dbContext.Orders.Select(o => new CustomDto
    {
      Id = o.Id,
      Name = o.Name,
      TotalPrice = _dbContext.OrderRows.Where(or => or.OrderId == o.Id).Sum(or => or.wkr.Price)
    }).ToListAsync();

我没有测试过,但希望这个想法很清楚

【讨论】:

    猜你喜欢
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    相关资源
    最近更新 更多