为什么这个LINQ连接查询可以工作,而另一个不行?

本文关键字:另一个 工作 LINQ 连接 查询 为什么 | 更新日期: 2023-09-27 18:04:34

我使用连接方法编写了两个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>

为什么这个LINQ连接查询可以工作,而另一个不行?

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

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