2013-10-22 81 views
2

我有一个包含付款时间表列表的发票列表,付款时间表包含期刊集合。Linq where集合中的集合条款

发票 - >付款时刻表 - >付款时间表期刊

我想有到期逾期的付款时间表杂志状态的所有发票。

我无法获得Linq语句来深入二级。

我想这样的事情没有成功(状态为状态列表):

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

回答

6

试试这个:

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

记住Any()回报truefalse如果有匹配物品被找到,而不是物品本身。因此,在代码中使用Any()并不会返回任何数据。

另外,如果单独运行(不确定这是否只是表达式的一部分),而不是发票,此查询将返回付款时间表。

进一步说明:此查询查找具有有效状态列表中状态的PaymenScheduleJournal的任何PaymentSchedules。请记住,致电Where()将返回实际的查询项目,但就期刊而言,这不是我们想要的:我们希望拥有有效期刊的所有时间表。这就是Any()给我们的 - 任何有日志的日程安排。我们重复相同的流程来加载任何具有有效付款时间表的发票,因为发票是我们实际发生的事情(请注意第三次致电Any())。

+0

这导致我得到未知变量的同样的错误,我 – endyourif

+0

关于收益支付时间表,而不是发票最后的编辑似乎是缺陷。 – endyourif

+0

我想我缩小了一点: i => i.PaymentSchedules.Where(p => p.PaymentScheduleJournals.Where(ps => statuses.Contains(ps.Status))。Any())。Select p => p.InvoiceId).Contains(i.Id) – endyourif

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)));