而不是僅僅寫一條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聲明中做到這一點。不確定這是否會提高可讀性和可維護性。
請顯示你的嘗試。如果你想要一個linq解決方案,你必須付出一些努力。 SO不是代碼翻譯服務 –