";无法创建类型为的常量值";如何避免LINQ查询中出现此错误

本文关键字:quot 查询 LINQ 错误 何避免 常量 创建 类型 | 更新日期: 2023-09-27 18:25:25

我有这个方法:

public virtual IEnumerable<Invoice> GetHomePageInvoices(IList<Area> areas, FinancialYearLookup financialYear)
{
    var homePageInvoices = _db.Invoices.Where(x => areas.Any(z => z.Id == 3)).ToList();
    ...
}

基本上,我试图找到与参数区域中的任何发票匹配的任何发票。

我得到错误:

无法创建类型为"Models"的常数值。区域"。只有中支持基元类型(如Int32、String和Guid)在此背景下。

有人能解释为什么会发生这种情况以及如何解决吗?

";无法创建类型为的常量值";如何避免LINQ查询中出现此错误

您不能在Linq Provider的上下文中使用IList<Area>(可能是Linq to Entities)-只需事先提取id,然后使用Contains查询,该查询可以处理基元集合:

List<int> ids = areas.Select( x=> x.Id).ToList();
var homePageInvoices = _db.Invoices
                          .Where(x => ids.Contains(x.Id))
                          .ToList();

此外,我假设您不想与固定值3进行比较,所以我相应地更改了您的查询,前提是Invoice实体具有Id属性。

a。看起来你在这里有一个打字错误:

z => z.Id == 3

但主要问题是b.我猜你在实体中使用Linq,但不清楚。在任何情况下,所发生的事情都是查询生成器试图转换"区域"。Any(…)'转换为SQL,但它无法做到这一点,因为areas不是数据库中的IQueryable,而是本地变量。我建议您使用类似于此处或此处所述的WhereIn自定义Linq运算符。这将生成一个SQL in子句,其中包含您可能想要匹配的区域中的所有项。