Linq to Entities加入DefaultIfEmpty返回没有结果

时间:2014-08-13 15:09:13

标签: c# sql linq entity-framework entity-framework-6

以下查询不会产生任何结果:

var query = from g in context.Groups
            join sl in context.GroupDancerLinks on g.Id equals sl.GroupId into sls
            join usl in context.GroupForeignDancerLinks on g.Id equals usl.GroupId into usls
            from sl in sls.DefaultIfEmpty()
            from usl in usls.DefaultIfEmpty()
            where usl.IsLead
            where sl.IsLead
            select new GroupGridDTO
            {
                Id = g.Id,
                LeadName = sl.Dancer.Name,
                UnregisteredLeadName = usl.ForeignDancer.Name,
                DancersCount = sls.Count(),
                ForeignDancersCount = usls.Count()
            };

但是,当修改相同的查询以使用FirstOrDefault时,会找到结果:

var query = from g in context.Groups
            join sl in context.GroupDancerLinks on g.Id equals sl.GroupId into sls
            join usl in context.GroupForeignDancerLinks on g.Id equals usl.GroupId into usls
            select new GroupGridDTO
            {
                Id = g.Id,
                LeadName = sls.Where(sl => sl.IsLead).Select(sl => sl.Dancer.Name).FirstOrDefault(),
                UnregisteredLeadName = usls.Where(usl => usl.IsLead).Select(usl => usl.ForeignDancer.Name).FirstOrDefault(),
                DancersCount = sls.Count(),
                ForeignDancersCount = usls.Count()
            };

查看查询的编写方式,结果应该相同。第一次查询有什么问题?

修改

表"组"和" ForeignDancers"与M2M表" GroupForeignDancerLinks"。

有关

表"组"和#34;舞者"与M2M表" GroupDancerLinks"。

有关

1 个答案:

答案 0 :(得分:1)

在第一个查询中,如果给定行的IsLead为false,则该行将被完全删除。在第二个查询中,该行存在,您只需将相应项目的名称留空。

如果左表中给定行有多个匹配项,则查询在语义上也是不同的。第一个将列出所有匹配的行,后者仅列出第一个。