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

Elb*_*cho 5 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 };
Run Code Online (Sandbox Code Playgroud)

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

Jac*_*goń 4

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

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