繁体   English   中英

如何将此语句转换为 linq?

[英]How do I convert this statement into linq?

如何在Linq 中使用Sum()

  select sum(op.Quantity),
         sum(p.UnitPrice),
         sum(p.Discount),
         o.CreateAt 
    from OrderProduct op join 
         [Order] o on o.ID = op.OrderID join 
         Product p on p.ID = op.ProductID
group by o.CreateAt

与其只是编写 SQL 语句,不如定义您的目标会更有帮助。 您有一些表,并且想要从中提取信息。 你想要什么信息? 现在我必须猜测你的结构。

看来您有订单和产品以及订单产品。

每个订单都有零个或多个订单产品; 每个 OrderProduct 都只属于一个 Order。 每个订单也有一个 CreateAt 属性。

每个产品都有零个或多个 OderProducts; 每个 OrderProduct 都只属于一个 Product。 每个产品也有一个单价和一个折扣。

最后,每个 OrderProduct 都有一个属性 Quantity

您没有提到您是否使用实体框架。 但即使没有,您也可以使用 IQueryables 访问这三个表。 在实体框架中,这是通过 DbSet 完成的:

IQueryable<Product> products = ...
IQueryable<Order> orders = ...
IQueryable<OrderProduct> orderProducts = ...

婴儿步骤中的查询:

var joinedItems = from product in Products
join orderProduct in orderProducts on oderProduct.ProductId == product.Id
join order in orders on order.Id == orderProduct,OrderId
select new
{
    Quantity = orderProduct.Quantity,
    UnitPrice = product.UnitPrice,
    Discount = product.Discount,
    CreateAt = order.CreateAt,
};

多重连接是我唯一一次使用查询语法而不是方法语法。 单击此处查看多个连接的方法语法

因为每个产品只有一个 UnitPrice,我假设您不想要一个 Product 的所有 UnitPrice 的总和,但您想要在 CreateAt 上创建的项目的所有 Unitprice 的总和,以及类似的所有 Discounts 和 Quantities 的总和。

所以我们首先将所有joinedItems分组为具有相同CreateAt的joinedItems:

var itemsGroupedByCreateAt = joinedItems
    .GroupBy(joinedItem => joinedItem.CreateAt);

换句话说:将所有joinedItems 分组到组中,其中组中所有joinedItems 的CreateAt 值都相同。

结果是一组组。 每个组都加入了Items。 组中所有已加入的项具有相同的 CreateAt 值。 这个共同的值是组的键。

所以你所要做的就是让每个组对组中所有joinedItems的UnitPrices求和。 对数量和折扣执行相同操作。 请注意,每个组都会创建一个 sumResult:

var sumResults = itemsGroupedByCreateAt
    .Select(group => new 
    {
        TotalQuantity = group
            .Select(groupElement => groupElement.Quantity)
            .Sum(),
        TotalUnitPrice = group
            .Select(groupElement => groupElement.UnitPrice)
            .Sum(),
        Totaldiscount = group
            .Select(groupElement => groupElement.UnitPrice)
            .Sum(),
        // only if you need it in your result:
        CreateAt = group.Key,
    });

一句话:拿走你所有的joinedItems组。 从每个组中,获取组中的joinedItems。 从这些joinedItems 中只取Quantities,然后对它们求和。 将结果放在 totalQuantity 中。 对 UnitPrices 和 Discounts 执行相同操作

当然,您可以在一个大的 linq 语句中完成这一切。 不确定这是否会提高可读性和可维护性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM