不知道如何将以下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 } );