我如何捕获一个变量在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。数量和使用它在最后一行?我认为这可以用流畅的语法来完成,但我从来没有使用过它,也没有设法产生任何编译器喜欢的代码!

我如何捕获一个变量在Linq方法语法

首先可以简化以下部分

.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),
  })