Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么这个LINQ join查询可以工作,而另一个不能';T_C#_Asp.net_Entity Framework_Exception - Fatal编程技术网

C# 为什么这个LINQ join查询可以工作,而另一个不能';T

C# 为什么这个LINQ join查询可以工作,而另一个不能';T,c#,asp.net,entity-framework,exception,C#,Asp.net,Entity Framework,Exception,我已经使用join方法编写了两个LINQ查询。本质上,如果我切换要联接的对象的顺序,查询将不再工作并抛出错误: 无法创建“Domain.Entities.UsersSitesRole”类型的常量值。此上下文中仅支持基元类型(“如Int32、字符串和Guid”) 对象privilegesForUser是从我的实体框架上下文(usersInterole)和存储库派生的实体列表。Child也是来自我的EF上下文的IQueryable。这是由EF解析它在扩展方法中得到的表达式树的方式造成的 在许多情况下

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

无法创建“Domain.Entities.UsersSitesRole”类型的常量值。此上下文中仅支持基元类型(“如Int32、字符串和Guid”)


对象
privilegesForUser
是从我的实体框架上下文(usersInterole)和
存储库派生的实体列表。Child
也是来自我的EF上下文的
IQueryable

这是由EF解析它在扩展方法中得到的表达式树的方式造成的


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

请同时显示抛出的异常。@Jethro:再次阅读问题。我刚刚遇到这个问题,这似乎表明我甚至不应该尝试我正在做的事(加入内存中的集合,并从数据库中获取数据)。我想知道I.ToList()是否同时包含两组数据并将它们连接起来,如果连接顺序仍然有任何影响……如果我想将30个对象与另30个对象连接起来,为了方便起见,我只需加载它们并处理客户端。对成千上万的人这样做是不可接受的。这一切都与数据量有关。此外,还可以使用SQL事件探查器确定查询的工作方式。在你的工作版本上试试,看看到底发生了什么。谢谢你的建议,好主意。此外,我还进行了测试,在我的例子中,如果我对从.ToList()创建的两个内存中对象进行操作,那么连接顺序就变得无关紧要了
        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 };