用于集合中集合的 Linq where 子句
本文关键字:集合 where 子句 Linq 用于 | 更新日期: 2023-09-27 18:36:20
我有一个发票列表和一个付款计划列表,付款计划有一个日记帐集合。
发票 -> 付款计划 -> 付款计划 日记帐
我想获取付款计划日记帐状态为"到期"和"逾期"的所有发票。
我无法让 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()
实际上不会返回任何数据。
自行运行,此查询将返回付款计划(不确定这是否只是您在问题中的表达式的一部分),而不是发票。
进一步说明:此查询查找具有有效状态列表中的 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)));