[英]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.