2015-10-15 37 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类型捕获对象。井井有条。 –