C#在LINQ中左联接



不知道如何将以下sql转换为LINQ表达式。我的数据库确实使用了引用完整性,表Content与表Content_Training以1对多的关系相关(例如:1内容可以有多个Content_Training)。

select c.ContentId, c.Name, ct.TrainingTypeId 
from dbo.Content c left join dbo.ContentTraining ct on c.ContentId = ct.ContentId
where c.ExpirationDate is not null
order by ct.TrainingTypeId, c.Name

我试过这个,似乎有效。但是,我不确定"let"关键字的用法。

var data = (from c in context.Contents
let ct = ( from t in context.Content_Training where t.ContentId == c.ContentId
select new { t.TrainingTypeId } ).FirstOrDefault()
where c.ExpirationDate.HasValue
orderby ct.TrainingTypeId, c.Name
select new { c.ContentId, c.Name, ct.TrainingTypeId } ).ToList();

对于左联接,您需要使用DefaultIfEmpty()

您的查询应该类似于以下内容:

var query = from c in Content
            join ct in ContentTraining
            on c.ContentId equals ct.ContentId into g
            from ct in g.DefaultIfEmpty()
            where c.ExpirationDate != null
            select new
            {     
                c.ContentId, 
                c.Name, 
                ct.TrainingTypeId 
             }).ToList();

请参阅linq 中的左侧外部连接

http://msdn.microsoft.com/en-us/library/bb397895.aspx

或者,您可以考虑使用lambda而不是表达式语法。我还没有尝试过,但这应该会让你得到你需要的(如果你需要的是左联接)。

var foo = context.Contents.Include( "Content_Training" )
    .Where( c => c.ExpirationDate != null )
    .OrderBy( c => c.Content_Training.TrainingTypeId )
    .ThenBy( c => c.Name
    .Select( c => new { c.ContentId, c.Name, c.Content_Training.TrainingTypeId } );

相关内容

  • 没有找到相关文章

最新更新