【发布时间】:2019-05-20 23:42:27
【问题描述】:
我想将最早的信用发票日期映射到销售表中的列表。我有一个以下方式的列表。
var tb = // Some other method to get balances.
cust balance
1 1000
2 2000
3 3000
... so on ...
这些余额是几张发票的累积,有时可能是一张发票。
public class Sales
{
public int id { get; set; }
public DateTime saleDate { get; set; }
public int? cust { get; set; }
public decimal invoiceValue { get; set; }
// Other properties...
}
客户 1 的样本数据
saleInvNo saleDate cust invoiceValue
1 2018/12/01 1 500
12 2018/12/20 1 750
如果我现在取,报告应该如下。
cust balance balanceFromDate
1 1000 2018/12/01 // balance from this onwards.
2 2000 ???
3 3000 ???
有没有简单的方法可以通过 LINQ 实现这一点。
我尝试使用 TakeWhile,但尝试不成功。
foreach (var t in tb)
{
var sum = 0m;
var q = _context.SaleHeaders.Where(w=>w.cust == t.cust)
.OrderByDescending(o=>o.saleDate)
.Select(s => new { s.id, s.saleDate, s.invoiceValue }).AsEnumerable()
.TakeWhile(x => { var temp = sum; sum += x.invoiceValue; return temp > t.balance; });
}
注意:Sales 表有大约 75K 记录。
更多信息...
客户可以支付部分金额而不是销售发票。所有付款、发票都发布到另一个表,这就是为什么余额来自另一个表上的复杂查询。
Sales 表包含纯粹的原始销售数据。
现在,cust 1 的余额是 1000,而不是最后一张销售发票的价值,甚至最后一张销售发票的全部或部分价值。我需要映射“从头开始的平衡”。
【问题讨论】:
-
客户 1 的 1000 是从哪里获得的?你有两个发票值 500 和 750,1K 是从哪里来的?
-
Cust 1 balance 来自其他表上的其他一些复杂查询。当客户支付部分付款时,可能会发生。涉及价值和支付价值可能不同。
标签: c# linq entity-framework-core-2.1