我有一张带有付款时间表列表的发票清单,并且付款时间表有一系列日记帐。
发票 -> 付款计划 -> 付款计划日记帐
我想获取付款计划日记帐状态为到期和逾期的所有发票。
我无法让 Linq 语句深入到第二级。
我正在尝试这样的事情但没有成功(状态是状态列表):
i => i.PaymentSchedules.Any(p => p.PaymentScheduleJournals.Where(ps => statuses.Contains(ps.Status)))
我有一张带有付款时间表列表的发票清单,并且付款时间表有一系列日记帐。
发票 -> 付款计划 -> 付款计划日记帐
我想获取付款计划日记帐状态为到期和逾期的所有发票。
我无法让 Linq 语句深入到第二级。
我正在尝试这样的事情但没有成功(状态是状态列表):
i => i.PaymentSchedules.Any(p => p.PaymentScheduleJournals.Where(ps => statuses.Contains(ps.Status)))
尝试这个:
var invoices = Invoices.Where(
i => i.PaymentSchedules.Where(
p => p.PaymentScheduleJournals.Where(
ps => statuses.Contains(ps.Status))
.Any())
.Any());
请记住,如果找到任何匹配的项目,则Any()
返回true
,而不是项目本身。false
因此Any()
,在代码中使用它实际上不会返回任何数据。
此外,如果单独运行此查询将返回 Payment Schedules(不确定这是否只是您问题中表达的一部分),而不是发票。
进一步说明:此查询查找任何PaymenScheduleJournal 的PaymentSchedules,该PaymenScheduleJournal 的状态在有效状态列表中。请记住,调用Where()
将返回实际的查询项目,但对于日志,这不是我们想要的:我们想要所有具有有效日志的计划。这就是Any()
给我们的 - 任何有日记的时间表。我们重复相同的过程来加载任何具有有效付款计划的发票,因为发票是我们实际需要的(注意没有第三次调用Any()
)。
您可以使用SelectMany
投影运算符。
var validStatuses = new List<string>{"Due", "Overdue"};
var invoices = allInvoices
.Select(invoice => invoice.Schedules
.SelectMany(paymentSchedule => paymentSchedule.Journals)
.Where(journal => validStatuses.Contains(journal.Status)));