2015-02-23 81 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; 
     } 

这方面,我都会体健,以保持我的模型完整的(我不喜欢用匿名对象)。