场景:我有一个用户个人资料表和一个同事表。 employees表记录了用户配置文件所遵循的其他用户。在这个查询中,我抓住所有跟踪当前登录用户的人(从同事表中获取他们的记录ID并加入用户个人资料表以获取他们的详细信息)。然后,我再次加入同事表,看看登录用户是否正在关注该用户。
问题:我的理解是,进行LEFT JOIN的最佳方式是(在寻找用户跟随同事的同事记录时)添加“DefaultIfEmpty()”到加入。当我将.DefaultIFEmpty()添加到该连接时,我收到以下错误消息:
System.NotSupportedException:LINQ to Entities无法识别方法'System.Collections.Generic.IEnumerable'
如果我从该连接中删除“.DefaultIFEmpty()”,它就可以了。但是,它将其作为常规JOIN运行,而不会记录用户未跟踪同事的记录。
代码:这是我正在使用的代码:
var results = (from a1 in db.Colleague
join b1 in db.UserProfile on new {ColleagueId = a1.ColleagueId} equals
new {ColleagueId = b1.RecordId}
join d1 in db.UserProfile on new {RecordId = a1.OwnerId} equals
new {RecordId = d1.RecordId}
join c1 in db.Colleague
on new {OwnerId = b1.RecordId, Ignored = false, ColleagueId = a1.OwnerId}
equals new {c1.OwnerId, c1.Ignored, c1.ColleagueId} into c1Join
from c1 in c1Join.DefaultIfEmpty() // This is the .DefaultIfEmpty() breaking the query
where
b1.AccountName == userName &&
a1.Ignored == false
orderby
b1.LastName
select new
{
RecordId = (System.Int64?) d1.RecordId,
d1.AccountName,
d1.PreferredName,
d1.FirstName,
d1.LastName,
d1.PictureUrl,
d1.PublicUrl,
IsFollowing = c1.OwnerId < 1 ? 0 : 1
});
foreach (var result in results) // This is what throws the error
{
// Do stuff
}
有什么想法吗?
答案 0 :(得分:2)
.NET框架3.5版中的实体框架SQL提供程序不支持DefaultIfEmpty()。抱歉,找不到比本文更好的参考资料:http://smehrozalam.wordpress.com/2009/06/10/c-left-outer-joins-with-linq/
您可能希望直接尝试LINQ-to-SQL而不是ADO.NET实体框架。我相信它适用于LINQ-to-SQL。我已经在过去验证过,通过LinqPad,左连接工作在3.5。
答案 1 :(得分:2)
看起来你需要创建一个默认值来传递给DefaultIfEmpty(),因为DefaultIsEmpty()接受一个参数。
答案 2 :(得分:1)
DefaultIfEmpty
。 EF的第一个版本不支持DefaultInEmpty
。