2017-10-10 255 views
-7

如何在Linq中使用Sum()如何将此语句转换为linq?

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 
+5

请显示你的尝试。如果你想要一个linq解决方案,你必须付出一些努力。 SO不是代码翻译服务 –

回答

2

而不是仅仅写一条SQL语句,定义你的目标会更有帮助。你有一些表格,你想从中提取信息。你想要哪些信息?现在我必须猜测你的结构。

看来你有订单和产品和OrderProducts。

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

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

最后每个OrderProduct有一个属性数量

你没有提到是否要使用实体框架或没有。但即使没有,您也可以使用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, 
}; 

多次join是我使用的查询语法,而不是方法的语法唯一的一次。 Click here to see the method syntax for multiple joins

因为每一个产品只有一个单价,我想你不希望一个产品的所有单价的总和,但你希望所有Unitprices对CreateAt创建项目的总和,同样所有的总和折扣和数量。

所以我们第一组的所有joinedItems到joinedItems具有相同CreateAt:

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

在口头上:采取一切joinedItems,并将它们组合成,其中组中的所有joinedItems有CreateAt相同的值组。

结果是组的序列。每个小组都加入了项目。组中的所有连接项都具有相同的CreateAt值。这个共同的价值是团队的关键。

因此,您所要做的就是让每个组对所有组合中的所有物件的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。从这些加入的项目中只取出数量,然后求和它们。将结果放入总量。 为单价和折扣做同样的事情

当然,您可以在一个大的linq声明中做到这一点。不确定这是否会提高可读性和可维护性。