WHERE没有包含在LINQ查询中

时间:2015-02-23 16:09:11

标签: c# linq entity-framework

今天我遇到了Entity Framework的问题。我不确定这是一个奇怪的错误还是我做错了什么。我已经在整个论坛上寻找任何可能的解决方案,但我找不到任何解决方案。

我有以下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对象上。

我希望有人能帮我解决这个问题。

亲切的问候,

Rob H

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我终于做了另一个(hacky)解决方案。这是我的最终代码:

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

这样我就可以保持我的模型完整(我不喜欢使用匿名对象)。