2

我有一张带有付款时间表列表的发票清单,并且付款时间表有一系列日记帐。

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

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

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

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

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

2 回答 2

7

尝试这个:

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())。

于 2013-10-22T13:03:03.380 回答
2

您可以使用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)));
于 2013-10-22T13:44:09.347 回答