如何将此语句转换为linq?

时间:2017-10-10 08:21:19

标签: c# sql-server 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

1 个答案:

答案 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语句中完成这一切。不确定这是否会提高可读性和可维护性。