";无法创建类型为的常量值";如何避免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 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子句,其中包含您可能想要匹配的区域中的所有项。