2015-02-23 82 views
0

今天我遇到了Entity Framework的一個問題。我不確定這是一個奇怪的錯誤還是我做錯了什麼。我已經在整個論壇上尋找任何可能的解決方案,但沒有一個我發現爲我工作。LINQ查詢中沒有包含哪裏

我有以下LINQ查詢:

return (from sp in context.ServiceProviders.DefaultIfEmpty() 
    join pl in context.Platforms on sp.Id equals pl.ServiceProviderId into innerPl 
    from pl in innerPl.DefaultIfEmpty() 
    join pp in context.Participants on pl.Id equals pp.PlatformId into innerPp 
    from pp in innerPp.DefaultIfEmpty() 
    join ps in context.Paymentsettlements on pp.Id equals ps.ParticipantId into innerPs 
    from ps in innerPs.Where(ps => ps.ConfirmedOn.HasValue && ps.ExportDate.HasValue && !ps.StatisticsDate.HasValue).DefaultIfEmpty() 
    select sp).Include(sp => sp.Environment) 
       .Include(sp => sp.Platforms.Select(pl => pl.Participants.Select(pp => pp.Paymentsettlements.Select(ps => ps.Requester)))) 
       .Include(sp => sp.Platforms.Select(pl => pl.Participants.Select(pp => pp.Paymentsettlements.Select(ps => ps.Payer)))) 
       .ToList(); 

我正在尋找的結果是,我總是得到的ServiceProvider不管是否有在裏面的ServiceProvider對象。目前我正在得到這個結果,但是我在查詢中的位置並沒有被考慮在內。以下哪裏沒有任何區別:

innerPs.Where(ps => ps.ConfirmedOn.HasValue && ps.ExportDate.HasValue && !ps.StatisticsDate.HasValue).DefaultIfEmpty() 

如果StatisticsDate有一個值,那麼這些Paymentsettlements也會在輸出中給出。

我已經嘗試將WHERE語句放在context.Paymentsettlements對象上。

我希望任何人都可以幫助我解決這個問題。

親切的問候,

羅布^ h

+1

您是否需要'LEFT OUTER JOIN'?因爲,你所做的是左連接。 – 2015-02-23 16:10:56

+0

是的,我總是希望所有對象(它只需要篩選不符合WHERE子句要求的Paymentsettlements,但如果沒有Paymentsettlements,我確實需要上述對象) – RobH 2015-02-23 16:12:09

+0

不確定,但可能是因爲懶惰的執行。 嘗試在where語句之後添加.ToList()。 (即 - innerPs.Where(ps => ps.ConfirmedOn.HasValue && ps.ExportDate.HasValue &&!ps.StatisticsDate.HasValue).ToList()。DefaultIfEmpty() – 2015-02-23 16:16:02

回答

0

其實你正在做左的連接,然後選擇ServiceProviders。在這裏你得到所有的提供者。然後,您將包含所有子元素:select sp).Include(sp => sp.Environment)。這不起作用。它將包括所有行。

你所能做的,只能是選擇以匿名類型喜歡

select new {sp, ps } 

不幸的是沒有在包括對象的過濾方式。 Include就像是什麼也不是。 你可以閱讀一下:

How to filter nested collection Entity Framework objects?

EF Query With Conditional Include

+0

Thanks for答案。我已經有了它與匿名對象的工作,但我認爲必須有一種方法來使用我的模型,因爲他們的意圖。 – RobH 2015-02-23 17:58:52

0

我終於做另一個(哈克)解決方案。這是我的最終代碼:

using (var context = new BetaalplatformContext()) 
     { 
      var dienstverleners = context.Dienstverleners.Include(dv => dv.Omgeving) 
                 .Include(dv => dv.Platformen) 
                 .Include(dv => dv.Platformen.Select(pl => pl.Deelnemers)) 
                 .Include(dv => dv.Platformen.Select(pl => pl.Deelnemers.Select(dn => dn.Betaalregelingen))) 
                 .Include(dv => dv.Platformen.Select(pl => pl.Deelnemers.Select(dn => dn.Betaalregelingen.Select(br => br.Aanvrager)))) 
                 .Include(dv => dv.Platformen.Select(pl => pl.Deelnemers.Select(dn => dn.Betaalregelingen.Select(br => br.Betaler)))) 
                 .ToList(); 

      dienstverleners.ForEach(
       dv => dv.Platformen.ForEach(
        pl => pl.Deelnemers.ForEach(
         dn => dn.Betaalregelingen = dn.Betaalregelingen 
          .Where(br2 => br2.BevestigdOp.HasValue && br2.ExportDatum.HasValue && !br2.StatistiekDatum.HasValue) 
          .ToList() 
         ) 
        ) 
       ); 

      return dienstverleners; 
     } 

這方面,我都會體健,以保持我的模型完整的(我不喜歡用匿名對象)。