为什么这个LINQ连接查询工作,但另一个没有?

时间:2011-08-04 12:33:56

标签: c# asp.net entity-framework exception

我使用join方法编写了两个LINQ查询。基本上,如果我切换要连接的对象的顺序,查询将不再起作用并抛出错误:

“无法创建类型为'Domain.Entities.UsersSitesRole'的常量值。在此上下文中仅支持基本类型(例如Int32,String和Guid')。”

        var foo2 = //works
            from p in privilegesForUser
            join c in repository.Child on p.SiteId equals c.Child_SiteID
            select new { ChildID = c.Child_ChildID, name = c.Child_FirstName, site = c.Child_SiteID, p.PrivilegeLevel };

        var foo3 = //throws exception
            from c in repository.Child
            join p in privilegesForUser on c.Child_SiteID equals p.SiteId
            select new { ChildID = c.Child_ChildID, name = c.Child_FirstName, site = c.Child_SiteID, p.PrivilegeLevel };

对象privilegesForUser是从我的实体框架上下文(UsersSiteRole)派生的实体列表,repository.Child也是来自我的EF上下文的IQueryable<Child>

1 个答案:

答案 0 :(得分:4)

这是由EF解析扩展方法中获得的表达式树的方式引起的。

在很多情况下,查询在逻辑上是正确的,并且在IEnumerable(Linq to Objects)上执行得很好但在Linq to Entities中失败。基本上,几乎不可能将任何逻辑表达式树编译成适当的SQL语句(SQL不理想,远离面向对象的世界),这就是EF放弃的情况。随着时间的推移,你会习惯了解哪些有效,哪些无效。