Linq查询Left Join条件

时间:2012-04-19 21:49:55

标签: linq join conditional-statements

我试图使用Linq语法重新创建以下sql查询,由于某种原因它无法正常工作,请告诉我这里我做错了什么

我的SQL查询:

select 
cf.VisitConfigId,
cf.VisitName,
sv.VisitDate 
from SubjectVisitConfig cf 
left join SubjectVisit sv on cf.VisitConfigId = sv.VisitConfigId

我的Linq查询:

var q = from cf in ctms.SubjectVisitConfigs
        join sv in ctms.SubjectVisits on cf.VisitConfigId equals  
        sv.VisitConfigId into JoinedVisits
        from sv in JoinedVisits.DefaultIfEmpty()
        where sv.SubjectId == subjectId.Value && sv.SiteId == siteId.Value
        select new
        {
            sv.VisitId,
            VisitDate = sv.VisitDate != null ? sv.VisitDate : null,
            cf.VisitName
        };

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

您在select子句中无条件取消引用sv - 但对于没有匹配sv的项,SubjectVisit将在逻辑上为空。您希望where子句匹配sv为空的任何结果?

这是一个可能的重写:

var q = from cf in ctms.SubjectVisitConfigs
        join sv in ctms.SubjectVisits
                       .Where(x => x.SubjectId == subjectId.Value && 
                              x.SiteId == siteId.Value)
             on cf.VisitConfigId equals sv.VisitConfigId into JoinedVisits
        from sv in JoinedVisits.DefaultIfEmpty()
        select new
        {
            VisitId = sv == null ? null : sv.VisitId,
            VisitDate = sv == null ? null : sv.VisitDate,
            cf.VisitName
        };