2017-10-10 435 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聲明中做到這一點。不確定這是否會提高可讀性和可維護性。