“无法创建类型的常量值。”如何在LINQ查询中避免此错误?

时间:2012-02-22 22:59:19

标签: c# linq linq-to-entities

我有这个方法:

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

    ...
}

基本上我正在尝试查找区域与参数区域中的任何区域匹配的任何发票。

我收到了错误:

  

无法创建“Models.Area”类型的常量值。只要   支持原始类型(例如Int32,String和Guid')   这个背景。

任何人都可以解释为什么会发生这种情况以及如何解决?

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:0)

一个。看起来你有一个错字:

z => z.Id == 3

但主要问题是 湾我猜你正在使用Linq to Entities,但不清楚。在任何情况下,正在发生的事情是查询构建器正在尝试将“areas.Any(...)”转换为SQL而它无法执行此操作,因为区域不是数据库中的IQueryable,而是局部变量。我建议你使用像Where herehere这样的自定义Linq运算符。这将构建一个SQL in子句,其中包含您可能想要匹配的区域中的所有项目。