【问题标题】:LINQ Operations on Lambda GroupingLambda 分组上的 LINQ 操作
【发布时间】:2010-10-17 20:24:47
【问题描述】:

我被一个 LINQ 组困住了,试图在不使用 foreach 语句的情况下解决它,这里是 escenary:

我有两个通用集合List<OrderHeader>List<OrderDetail>,它们都有一个相同的字段TOTRGVS,其中包含订单的总金额,订单数量是名为NDORGV的键。

然后我想找到“OrderHeaderOrderDetailTOTRGVS不一样的订单”,所以我尝试了以下查询:

 List<RGVCAFAC_ERRORES> diff = (from d in lstOrderDetail 
                               join c in lstOrderHeader on d.NDORGV equals c.NDORGV                                                     
                               group d by d.NDORGV into g
                               let difTOTOrderDetail = g.Select(p => p.TOTRGVS).Sum()
                               let difTOTOrderHeader = g.Key.????
                               let diffTOT = difTOTOrderHeader - difTOTOrderDetail
                               where diffTOT != 0
                               select new _ERRORS
                               {
                                   NDORGV = g.Key,
                                   IMPORT = diffTOT
                               }
  ).ToList();

difTOTOrderHeader 中,我不知道如何从OrderHeader 检索TOTRGVS 字段。我尝试过使用 Key 但无法获取任何字段,只是格式化方法的扩展。

【问题讨论】:

  • 如果您认为不使用 foreach 循环很难完成这项工作,请考虑调试的难度。如果这样做更容易,请继续使用循环。

标签: linq lambda group-by


【解决方案1】:

这可能会奏效:

var dictDetails = lstOrderDetail
  .GroupBy(d => d.NDORGV)
  .ToDictionary(g => g.Key, g => g.Sum(d => d.TOTRGVS));

var result = lstOrderHeader
  .Where(h => dictDetails[h.NDORGV] != h.TOTRGVS)
  .ToList();

【讨论】:

    【解决方案2】:

    Except 函数通常用于确定列表中的差异。

    【讨论】:

    • 标题或细节中的例外?当已经存在一个由 X 和 X 确定“选定对象”的组时,我也忘记告诉 Detail 可以有不止一行,这就是我使用组总和的原因!
    猜你喜欢
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 2013-05-17
    • 1970-01-01
    相关资源
    最近更新 更多