DefaultIfEmpty()导致“System.NotSupportedException:LINQ to Entities无法识别方法'System.Collections.Generic.IEnumerable'”

时间:2011-09-21 15:12:34

标签: c# sql linq entity-framework linq-to-entities

场景:我有一个用户个人资料表和一个同事表。 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
}

有什么想法吗?

3 个答案:

答案 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()接受一个参数。

DefaultIfEmpty() on MSDN

答案 2 :(得分:1)

仅在EFv4 +中支持

DefaultIfEmpty。 EF的第一个版本不支持DefaultInEmpty