在Any()子句中使用FirstOrDefault时出现NotSupportedException

时间:2017-04-19 09:52:15

标签: c# entity-framework linq

我使用以下LINQ查询从我的数据库中获取用户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();

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

  

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

     

其他信息:无法创建类型的常量值   'WebApplicationTestDb.Models.tbl_roles'。只有原始类型或   在此上下文中支持枚举类型。

但是当我使用变量usr_role_id临时存储usr.tbl_roles.FirstOrDefault().Id时,一切正常。

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();

我的问题是:为什么这两种情况有不同的行为?

1 个答案:

答案 0 :(得分:0)

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

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

以下是同一问题的另一个答案https://stackoverflow.com/a/15592157/920557