以下查询不会产生任何结果:
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"。
有关答案 0 :(得分:1)
在第一个查询中,如果给定行的IsLead
为false,则该行将被完全删除。在第二个查询中,该行存在,您只需将相应项目的名称留空。
如果左表中给定行有多个匹配项,则查询在语义上也是不同的。第一个将列出所有匹配的行,后者仅列出第一个。