如何在 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
答案 0 :(得分:2)
不仅仅是编写SQL语句,而是定义目标会更有帮助。你有一些表,你想从中提取信息。你想要哪些信息?现在我必须猜测你的结构。
您似乎拥有Orders and Products和OrderProducts。
每个订单都有零个或多个OrderProducts;每个OrderProduct只属于一个订单。每个订单还有一个CreateAt属性。
每个产品都有零个或多个OderProducts;每个OrderProduct都属于一个产品。每个产品还有UnitPrice和折扣。
最后,每个OrderProduct都有一个属性Quantity
您没有提及是否使用实体框架。但即使没有,您也可以使用IQueryables访问这三个表。在实体框架中,这是通过DbSets完成的:
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,
};
多次加入是我使用查询语法而不是方法语法的唯一时间。 Click here to see the method syntax for multiple joins
因为每个产品只有一个UnitPrice,我假设你不想要一个产品的所有UnitPrice的总和,但你想要在CreateAt上创建的所有Unitprices的总和,以及所有折扣和数量的总和
因此,我们首先将所有joinedItems分组到具有相同CreateAt的joinedItem:
var itemsGroupedByCreateAt = joinedItems
.GroupBy(joinedItem => joinedItem.CreateAt);
单词:取所有的joinedItems并将它们分组,其中组中的所有joinedItems对CreateAt具有相同的值。
结果是一系列的组。每个小组都加入了项目。组中的所有joinedItem对CreateAt具有相同的值。这个共同的价值是集团的关键。
因此,您所要做的就是让每个组对组中所有joinedItem的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。从这些joinItems只取数量,并求它们。将结果放入totalQuantity中。 对UnitPrices和折扣
执行相同操作当然,你可以在一个大的linq语句中完成这一切。不确定这是否会提高可读性和可维护性。