我如何捕获一个变量在Linq方法语法
本文关键字:变量 Linq 方法 语法 一个 何捕获 | 更新日期: 2023-09-27 18:17:57
我有以下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属性,需要在最后一行使用。
我真正想做的是这样的…
Quantity = pcpb.Sum (pcpb1 => (pcpb1.Quantity ?? 0) * ppc.Quantity),
…但我当然不能,因为ppc不在范围内。
我将如何捕获ppc。数量和使用它在最后一行?我认为这可以用流畅的语法来完成,但我从来没有使用过它,也没有设法产生任何编译器喜欢的代码!
首先可以简化以下部分
.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),
})