首页 > 解决方案 > select语句中的linq减法

问题描述

我想在多个重叠的日期范围内分配总和的值。因此,此查询的最终结果只是 2 条日期范围重叠的记录。但是,当前查询只是复制每个中的值(数量)。但是,我只想将数据放在第一条记录中,因为它是与第二条记录在同一日期范围内的第一条记录,所以第二条记录数量(AllocQty)我希望为 0。现在它的数量相等对于这两个记录,并且它们在相同的日期范围内。我正在修改现有代码,所以我想知道是否有一种方法可以修改代码以某种方式从第一组中减去总和,因此它不会放在第二组中。有没有办法在不大量重写的情况下做到这一点?

from c in com
  join b in all on c.SKU equals b.SKU into ps
  from b in ps.DefaultIfEmpty()
  .Where(x => x == null || (c.StartDate <= x.FinishDate && c.EndDate >= x.FinishDate)).DefaultIfEmpty()
  select new
  {
      ComId = c.ComId,
      metadatafromtablec,
      etc...
      ...
      AllocQty = b != null ? b.VDC_Alloc : 0,  //Here I want this value to be zero in the 2nd overlapping group (startdate)

  } into x

//It groups by every single field except for the calculated sum of the VAlloc //and KAlloc quantities

  group x by new { x.ComId, x.ComType, x.CustType, x.CustrId, x.SKU, x.StartDate, x.EndDate} into grp
  select new CommitmentView
  {
      CommId = grp.Key.ComId,
      ...
      ...
      AllocQty = grp.Sum(r => r.AllocQty),
      TotalAllocQty = grp.Sum(r => r.AllocQty) + grp.Sum(r => r.KAllocQty),
  } into cv
  orderby cv.SKU ascending
  select cv

表c(com):

通讯录 COM_TYPE 客户类型 卡斯特里 库存单位 开始日期 结束日期 VDC_CQ KDC_CQ 系统状态 由...制作 创建日期 UPDATED_BY UPDATED_DATE
108 零售 BCL 0 111872 2021 年 2 月 1 日 2021 年 4 月 12 日 2400 1560 得到正式认可的 胡马克 2021 年 2 月 9 日下午 3:26:18 chrj 2021 年 2 月 23 日上午 11:43:41
107 零售 BCL 0 111872 2021 年 2 月 7 日 2021 年 4 月 13 日 288 84 草稿 chrj 2021 年 2 月 8 日下午 3:28:24 chrj 2021 年 2 月 24 日下午 6:27:51

表b(全部):

EVENT_ID LINE_ID 库存单位 卡斯特里 分配数量 提交状态 错误代码 ERROR_DESCRIPTION 由...制作 创建日期 UPDATED_BY UPDATED_DATE 完成日期 计量单位 顾客类型
100150 5344 111872 3 12 预定的 chrj 2021 年 2 月 23 日下午 6:11:04 2021 年 2 月 23 日下午 6:11:04 2021 年 4 月 13 日 C BCL
100148 5342 111872 3 12 预定的 chrj 2021 年 2 月 8 日下午 3:23:27 2021 年 2 月 8 日下午 3:23:27 2021 年 2 月 9 日 C BCL
100149 5343 111872 3 12 预定的 chrj 2021 年 2 月 9 日下午 1:58:30 2021 年 2 月 9 日下午 1:58:30 2021 年 2 月 9 日 C BCL
100139 4952 111872 160 12 预定的 chrj 2021 年 2 月 5 日下午 4:38:46 2021 年 2 月 5 日下午 4:38:46 2021 年 2 月 11 日 C BCL
100139 4954 111872 129 24 预定的 chrj 2021 年 2 月 5 日下午 4:38:46 2021 年 2 月 5 日下午 4:38:46 2021 年 2 月 11 日 C BCL
100139 4956 111872 228 60 预定的 chrj 2021 年 2 月 5 日下午 4:38:46 2021 年 2 月 5 日下午 4:38:46 2021 年 2 月 11 日 C BCL
100139 4958 111872 218 12 预定的 chrj 2021 年 2 月 5 日下午 4:38:46 2021 年 2 月 5 日下午 4:38:46 2021 年 2 月 11 日 C BCL
100139 4960 111872 167 36 预定的 chrj 2021 年 2 月 5 日下午 4:38:46 2021 年 2 月 5 日下午 4:38:46 2021 年 2 月 11 日 C BCL
100139 4961 111872 158 120 预定的 chrj 2021 年 2 月 5 日下午 4:38:46 2021 年 2 月 5 日下午 4:38:46 2021 年 2 月 11 日 C BCL
100139 4964 111872 76 36 预定的 chrj 2021 年 2 月 5 日下午 4:38:46 2021 年 2 月 5 日下午 4:38:46 2021 年 2 月 11 日 C BCL
100139 4966 111872 163 24 预定的 chrj 2021 年 2 月 5 日下午 4:38:46 2021 年 2 月 5 日下午 4:38:46 2021 年 2 月 11 日 C BCL
100139 4969 111872 174 12 预定的 chrj 2021 年 2 月 5 日下午 4:38:46 2021 年 2 月 5 日下午 4:38:46 2021 年 2 月 11 日 C BCL

电流输出:

通讯录 COM_TYPE 客户类型 卡斯特里 库存单位 开始日期 结束日期 VDC_CQ KDC_CQ 系统状态 总分配数量 由...制作 创建日期 UPDATED_BY UPDATED_DATE
107 零售 BCL 0 111872 2021 年 2 月 7 日 2021 年 4 月 13 日 288 84 草稿 372 chrj 2021 年 2 月 8 日下午 3:28:24 chrj 2021 年 2 月 24 日下午 6:27:51
108 零售 BCL 0 111872 2021 年 2 月 1 日 2021 年 4 月 12 日 2400 1560 得到正式认可的 360 胡马克 2021 年 2 月 9 日下午 3:26:18 chrj 2021 年 2 月 23 日上午 11:43:41

您可以看到 360 的数量在两条记录中都是“重复的”。管理层希望进行更改,以允许这些记录按日期重叠(您可以看到从 2/7/2021 到 4/12/2021 的开始日期到结束日期重叠。所以,现在 360 应该在记录中与 comid 108 的数量,剩余的 12 数量应与 107 的 comid 一起记录,如下所示:

期望的输出:

通讯录 COM_TYPE 客户类型 卡斯特里 库存单位 开始日期 结束日期 VDC_CQ KDC_CQ 系统状态 总分配数量 由...制作 创建日期 UPDATED_BY UPDATED_DATE
107 零售 BCL 0 111872 2021 年 2 月 7 日 2021 年 4 月 13 日 288 84 草稿 12 chrj 2021 年 2 月 8 日下午 3:28:24 chrj 2021 年 2 月 24 日下午 6:27:51
108 零售 BCL 0 111872 2021 年 2 月 1 日 2021 年 4 月 12 日 2400 1560 得到正式认可的 360 胡马克 2021 年 2 月 9 日下午 3:26:18 chrj 2021 年 2 月 23 日上午 11:43:41

它应该在开始日期和结束日期范围内的重叠记录和 FinishDate 之间分配数量。您可以看到表 b 中有一条记录日期为 2021 年 4 月 13 日,因此这是应该在 comid == 107 的输出中的唯一记录。

标签: linqlambdasubtraction

解决方案


推荐阅读