linq - 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 的输出中的唯一记录。
解决方案
推荐阅读
- amazon-web-services - AWS 和 Docker 映像
- javascript - Javascript 脚本不登录到浏览器控制台
- kubernetes - 无法使用 Helm 在 Kubernetes 集群中部署 Minio
- javascript - 为什么我的 HTML 选择不允许我访问选项?
- html - 图像会自动调整大小
- r - 在时间序列的上下文中分解
- php - PHP MongoIDs 对象比较 - 最佳实践
- vue.js - vue-test-utils 窗口滚动
- c++ - C++ HackerRank - 数组操作
- c# - 无法反序列化具有列表的对象
其中 T 是从接口派生的