用于集合中集合的 Linq where 子句

本文关键字:集合 where 子句 Linq 用于 | 更新日期: 2023-09-27 18:36:20

我有一个发票列表和一个付款计划列表,付款计划有一个日记帐集合。

发票 -> 付款计划 -> 付款计划 日记帐

我想获取付款计划日记帐状态为"到期"和"逾期"的所有发票。

我无法让 Linq 语句深入到第二层。

我正在尝试这样的事情但没有成功(状态是状态列表):

i => i.PaymentSchedules.Any(p => p.PaymentScheduleJournals.Where(ps => statuses.Contains(ps.Status)))

用于集合中集合的 Linq where 子句

试试这个:

var invoices = Invoices.Where(
               i => i.PaymentSchedules.Where(
                    p => p.PaymentScheduleJournals.Where(
                         ps => statuses.Contains(ps.Status))
                    .Any())
               .Any());

请记住,如果找到任何匹配项,Any()将返回truefalse,而不是项本身。因此,在代码中使用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)));