2015-10-15 25 views
0

我有以下的Linq查詢...如何在Linq方法語法中捕獲變量?

Proposals.OrderByDescending (p => p.ID) 
    .First() 
    .Proposal_ProductConfigurations 
    .Select(ppc => ppc.ProductConfigurationHistory) 
    .Where(pch => pch.Active) 
    .Select(pch => pch.ProductConfiguration) 
    .Where(pc => pc.Active) 
    .SelectMany(pc => pc.ProductConfigurations_PriceBookEntries) 
    .Where(pcpb => pcpb.Active) 
    .OrderBy(pcpb => pcpb.PriceBook.ProductCode) 
    .GroupBy(pcpb => pcpb.PriceBook.ID) 
    .Select (pcpb => new { 
    Code = pcpb.First().PriceBook.ProductCode, 
    Description = pcpb.First().PriceBook.Description, 
    Quantity = pcpb.Sum (pcpb1 => (pcpb1.Quantity ?? 0)), 
    }) 

...這是不完全正確,因爲ppc.Quantity實體有需要在最後一行中使用的數量屬性。

我真正想要做的東西線這...

Quantity = pcpb.Sum (pcpb1 => (pcpb1.Quantity ?? 0) * ppc.Quantity), 

...但我當然不能,因爲PPC不在範圍內。

我將如何捕獲ppc.Quantity並在最後一行中使用它?我認爲這可以通過流暢的語法來完成,但我從不使用它,並且沒有設法產生編譯器喜歡的任何代碼!

+2

這Linq讓我的大腦受到傷害。你正在一行中遍歷似乎是非常複雜的對象結構。你有沒有考慮過把它分解成幾個步驟?順便說一句,它會讓你在先前的步驟中保存'ppc'(不管是什麼),然後在最後重新使用它。 – Vlad274

回答

2

首先可以簡化以下部分

.Select(ppc => ppc.ProductConfigurationHistory) 
.Where(pch => pch.Active) 
.Select(pch => pch.ProductConfiguration) 
.Where(pc => pc.Active) 

.Where(ppc => ppc.ProductConfigurationHistory.Active 
       && ppc.ProductConfigurationHistory.ProductConfiguration.Active) 

你會保持所得的ppc,而不是pc集合。

在這一點上,你會希望使用SelectMany過載,有一個結果選擇,以及作爲一個集合選擇,以保持ppc

.SelectMany(
    ppc => ppc.ProductConfigurationHistory 
       .ProductConfiguration 
       .ProductConfigurations_PriceBookEntries, 
    (ppc, pcpb) => new { ppc, pcpb }) 

然後你就必須用新的匿名類工作,你會得到這個

Proposals.OrderByDescending (p => p.ID) 
    .First() 
    .Proposal_ProductConfigurations 
    .Where(ppc => ppc.ProductConfigurationHistory.Active 
       && ppc.ProductConfigurationHistory.ProductConfiguration.Active) 
    .SelectMany(
    ppc => ppc.ProductConfigurationHistory 
       .ProductConfiguration 
       .ProductConfigurations_PriceBookEntries, 
    (ppc, pcpb) => new { ppc, pcpb }) 
    .Where(anon => anon.pcpb.Active) 
    .OrderBy(anon => anon.pcpb.PriceBook.ProductCode) 
    .GroupBy(anon => anon.pcpb.PriceBook.ID) 
    .Select (grp => new { 
    Code = grp.First().pcpb.PriceBook.ProductCode, 
    Description = grp.First().pcpb.PriceBook.Description, 
    Quantity = grp.Sum(anon => (anon.pcpb.Quantity ?? 0) * anon.ppc.Quantity), 
    }) 
+0

絕對精彩!謝謝。我不知道那個超載(仍然學習Linq),並沒有想到以anon類型捕獲對象。井井有條。 –

相關問題