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):

COMID COM_TYPE 客户类型 CUSTRID SKU START_DATE END_DATE VDC_CQ KDC_CQ COMSTATUS CREATED_BY CREATED_DATE UPDATED_BY UPDATED_DATE
108 零售 BCL 0 111872 2/1/2021 4/12/2021 2400 1560 已批准 胡马克 2/9/2021 下午 3:26:18 chrj 2/23/2021 上午 11:43:41
107 零售 BCL 0 111872 2/7/2021 4/13/2021 288 84 草稿 chrj 2/8/2021 下午 3:28:24 chrj 2021/2/24 下午 6:27:51

table b(全部):

EVENT_ID LINE_ID SKU CUSTRID 分配数量 提交状态 ERROR_CODE ERROR_DESCRIPTION CREATED_BY CREATED_DATE UPDATED_BY UPDATED_DATE 完成日期 计量单位 CUSTOMER_TYPE
100150 5344 111872 3 12 预定 chrj 2/23/2021 下午 6:11:04 2/23/2021 下午 6:11:04 4/13/2021 C BCL
100148 5342 111872 3 12 预定 chrj 2/8/2021 下午 3:23:27 2/8/2021 下午 3:23:27 2/9/2021 C BCL
100149 5343 111872 3 12 预定 chrj 2/9/2021 下午 1:58:30 2/9/2021 下午 1:58:30 2/9/2021 C BCL
100139 4952 111872 160 12 预定 chrj 2/5/2021 下午 4:38:46 2/5/2021 下午 4:38:46 2/11/2021 C BCL
100139 4954 111872 129 24 预定 chrj 2/5/2021 下午 4:38:46 2/5/2021 下午 4:38:46 2/11/2021 C BCL
100139 4956 111872 228 60 预定 chrj 2/5/2021 下午 4:38:46 2/5/2021 下午 4:38:46 2/11/2021 C BCL
100139 4958 111872 218 12 预定 chrj 2/5/2021 下午 4:38:46 2/5/2021 下午 4:38:46 2/11/2021 C BCL
100139 4960 111872 167 36 预定 chrj 2/5/2021 下午 4:38:46 2/5/2021 下午 4:38:46 2/11/2021 C BCL
100139 4961 111872 158 120 预定 chrj 2/5/2021 下午 4:38:46 2/5/2021 下午 4:38:46 2/11/2021 C BCL
100139 4964 111872 76 36 预定 chrj 2/5/2021 下午 4:38:46 2/5/2021 下午 4:38:46 2/11/2021 C BCL
100139 4966 111872 163 24 预定 chrj 2/5/2021 下午 4:38:46 2/5/2021 下午 4:38:46 2/11/2021 C BCL
100139 4969 111872 174 12 预定 chrj 2/5/2021 下午 4:38:46 2/5/2021 下午 4:38:46 2/11/2021 C BCL

电流输出

COMID COM_TYPE 客户类型 CUSTRID SKU START_DATE END_DATE VDC_CQ KDC_CQ COMSTATUS 总分配数量 CREATED_BY CREATED_DATE UPDATED_BY UPDATED_DATE
107 零售 BCL 0 111872 2/7/2021 4/13/2021 288 84 草稿 372 chrj 2/8/2021 下午 3:28:24 chrj 2021/2/24 下午 6:27:51
108 零售 BCL 0 111872 2/1/2021 4/12/2021 2400 1560 已批准 360 胡马克 2/9/2021 下午 3:26:18 chrj 2/23/2021 上午 11:43:41

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

期望的输出

COMID COM_TYPE 客户类型 CUSTRID SKU START_DATE END_DATE VDC_CQ KDC_CQ COMSTATUS 总分配数量 CREATED_BY CREATED_DATE UPDATED_BY UPDATED_DATE
107 零售 BCL 0 111872 2/7/2021 4/13/2021 288 84 草稿 12 chrj 2/8/2021 下午 3:28:24 chrj 2021/2/24 下午 6:27:51
108 零售 BCL 0 111872 2/1/2021 4/12/2021 2400 1560 已批准 360 胡马克 2/9/2021 下午 3:26:18 chrj 2/23/2021 上午 11:43:41

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)