我使用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>
。
答案 0 :(得分:4)
这是由EF解析扩展方法中获得的表达式树的方式引起的。
在很多情况下,查询在逻辑上是正确的,并且在IEnumerable
(Linq to Objects)上执行得很好但在Linq to Entities中失败。基本上,几乎不可能将任何逻辑表达式树编译成适当的SQL语句(SQL不理想,远离面向对象的世界),这就是EF放弃的情况。随着时间的推移,你会习惯了解哪些有效,哪些无效。