【问题标题】:Unable to create a constant value in a linq query无法在 linq 查询中创建常量值
【发布时间】:2013-03-12 18:27:55
【问题描述】:

运行此查询:

var holderAccounts = db.AccountDetails.Include(p => p.BranchDetail)
               .Where(p => holder.AccountDetails.Any(a => a.Id == p.Id));

我得到了这个例外:

无法创建“CodeFirst.AccountDetail”类型的常量值。此上下文仅支持原始类型或枚举类型。

关系是:

 AccountHolder 1 to many AccountDetail 1 to 1 BranchDetail

我做错了什么?

【问题讨论】:

  • holder 是 AccountHolder 实体的对象

标签: c# sql linq


【解决方案1】:

先尝试提取相关的ID:

var accountDetailIds = holder.AccountDetails.Select(a => a.Id);
var holderAccounts = db.AccountDetails
    .Include(p => p.BranchDetail)
    .Where(p => accountDetailIds.Contains(p.Id));

【讨论】:

    【解决方案2】:

    很可能不支持 Any()。试试这个查询:

    var ids = holder.AccountDetails.Select(x => x.Id).ToList();
    var holderAccounts = db.AccountDetails.Include(p => p.BranchDetail)
               .Where(p => ids.Contains(p.Id));
    

    【讨论】:

    • 看起来应该是Select 而不是SelectMany。值得注意的是,这只是一个选项,如果有少量的 ID,如果有很多,这将不起作用(或不起作用)。
    • 确实,很可能是Select
    【解决方案3】:

    我认为您尝试做的与 SQL Where-In 子句相同。正如 Jeffery Khan 提到的,我将提取您要查询的条件,然后在单独的语句中执行查询。希望article 能帮助您了解这种用于提高查询可读性的良好做法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多