【问题标题】:NotSupportedException when use FirstOrDefault in Any() clause在 Any() 子句中使用 FirstOrDefault 时出现 NotSupportedException
【发布时间】:2017-04-19 09:52:15
【问题描述】:

我使用以下 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();

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

【问题讨论】:

  • 您是否尝试过搜索?您需要将 usr.tbl_roles.FirstOrDefault().Id 提取到一个单独的变量中,并将 that 传递给第二个查询,就像在第二个示例中所做的那样。你有什么问题?
  • 除此之外,调用FirstOrDefault().SomeProperty 基本上是在说“我可以接受 NullReferenceException”。
  • @CodeCaster 这就是他在第二种方法中所做的 - 你完整地阅读了这个问题吗?
  • @Toshi 是的,那么问题是什么?
  • @CodeCaster,我似乎很清楚 OP 问道:“为什么使用存储 usr.tbl_roles.FirstOrDefault().Id 的临时变量查询成功,而没有它查询会失败?”。

标签: c# entity-framework linq


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    相关资源
    最近更新 更多