C# 在任何()子句中使用FirstOrDefault时不支持异常

C# 在任何()子句中使用FirstOrDefault时不支持异常,c#,entity-framework,linq,C#,Entity Framework,Linq,我使用以下LINQ查询从数据库中获取用户id和文档路径 不幸的是,我收到了错误消息: 中发生“System.NotSupportedException”类型的异常 EntityFramework.SqlServer.dll,但未在用户代码中处理 其他信息:无法创建类型为的常量值 “WebApplicationTestDb.Models.tbl_角色”。只有基元类型或 在此上下文中支持枚举类型 但是当我使用变量usr\u role\u id临时存储usr.tbl\u roles.FirstOrDe

我使用以下LINQ查询从数据库中获取用户id和文档路径

不幸的是,我收到了错误消息:

中发生“System.NotSupportedException”类型的异常 EntityFramework.SqlServer.dll,但未在用户代码中处理

其他信息:无法创建类型为的常量值 “WebApplicationTestDb.Models.tbl_角色”。只有基元类型或 在此上下文中支持枚举类型

但是当我使用变量
usr\u role\u id
临时存储
usr.tbl\u roles.FirstOrDefault().id
时,一切正常


我的问题是:为什么这两个案例有不同的行为?

由于您使用的数据提供程序的限制,您的案例有不同的行为,其中一些可能能够处理像您这样的复杂查询,而另一些则不能

当您的查询从LINQ转换为数据库查询语言(即SQL)时,会发生此错误。在第二种情况下,在执行转换步骤之前减少并预计算查询的一部分,并将其替换为常量。数据提供者现在可以毫无问题地翻译它。希望这有助于更好地理解它


这是同一问题的另一个答案。

由于您使用的数据提供程序的限制,您的案例有不同的行为,其中一些可能能够处理像您这样的复杂查询,而另一些则不能

当您的查询从LINQ转换为数据库查询语言(即SQL)时,会发生此错误。在第二种情况下,在执行转换步骤之前减少并预计算查询的一部分,并将其替换为常量。数据提供者现在可以毫无问题地翻译它。希望这有助于更好地理解它


这是同一问题的另一个答案。

您是否尝试过搜索?您需要将
usr.tbl\u roles.FirstOrDefault().Id
提取到一个单独的变量中,并将其传递给第二个查询,就像在第二个示例中一样。你的问题是什么?除了其他以外,调用
FirstOrDefault().SomeProperty
基本上是说“我可以得到一个null引用异常”。@CodeCaster这就是他在第二种方法中所做的-你完整地阅读了这个问题吗?@Toshi是的,那么问题是什么?@CodeCaster,我很清楚OP问:“为什么使用存储
usr.tbl_角色.FirstOrDefault().Id
的临时变量查询成功,而如果没有它,则查询失败?”。您是否尝试过搜索?您需要提取
usr.tbl_角色.FirstOrDefault().Id
转换为一个单独的变量,并将其传递给第二个查询,就像您在第二个示例中所做的那样。您的问题是什么?除此之外,调用
FirstOrDefault()。SomeProperty
基本上是说“我可以获取NullReferenceException“@CodeCaster这就是他在第二种方法中所做的-你完整地阅读了这个问题吗?@Toshi是的,那么问题是什么呢?@CodeCaster,我似乎很清楚OP问:“为什么使用存储
usr.tbl\u roles.FirstOrDefault().Id
的临时变量进行查询会成功,而没有它,查询就会失败?”。
var usr = DB.tbl_user
    .Where(x => x.Account.Contains(user))
    .ToList()
    .FirstOrDefault();

var _obj = (from tbl_pld_doc in DB.tbl_pld_doc
            where tbl_pld_doc.path != null
            where tbl_pld_doc.Item.Contains(doc)
            where tbl_pld_doc.tbl_roles.Any(x => x.Id == usr.tbl_roles.FirstOrDefault().Id)
            select tbl_pld_doc).ToList();
var usr = DB.tbl_user
    .Where(x => x.Account.Contains(user))                                
    .ToList()
    .FirstOrDefault();

var usr_role_id = usr.tbl_roles.FirstOrDefault().Id;

var _obj = (from tbl_pld_doc in DB.tbl_pld_doc
            where tbl_pld_doc.path != null
            where tbl_pld_doc.Item.Contains(doc)
            where tbl_pld_doc.tbl_roles.Any(x => x.Id == usr_role_id )
            select tbl_pld_doc).ToList();