2013-10-22 79 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)));