实体框架- Linq -比较可空对象- NotSupportedException

本文关键字:对象 NotSupportedException 比较 框架 Linq 实体 | 更新日期: 2023-09-27 18:14:05

我需要将对象与传入的参数进行比较。逻辑是:

  • 如果territory == null。返回所有Orders
  • 如果"territory != null"answers"Territory"为"!= null"。返回两个实体的Id属性(PK)的Orders匹配。

我有下面的LINQ语句:

我的方法的精简版本是(通常在WHERE子句中有其他过滤器):

  public void Execute(Territory territory)
  {
    using (var context = DatabaseHelper.CreateContext())
    {
      var orders = context.Orders.Where(x =>
        (
          (territory == null) ||
          (x.Territory != null && x.Territory.Id == territory.Id)
          )
        );
      if (!orders.Any()) //Exception occurs here on materialising the query
      {
        //Do something
      }
    }
  }

我收到异常NotSupportedException和消息:

无法创建类型为"ENTITY"的常量值。只有基本类型或在此上下文中支持枚举类型。

虽然我理解错误,因为我没有传入基本类型。我如何更改LINQ查询,使其返回预期的结果?

实体框架- Linq -比较可空对象- NotSupportedException

试试这个:

var t = territory == null;
var orders = context.Orders.Where(x =>        
       t || (x.Territory != null && x.Territory.Id == territory.Id));

这背后的原因是它试图将territory转换为SQL查询中的常量,但当然territory不是原始类型或服务器上的任何等效类型,所以它抛出异常。但是,您可以在外部缓存一个布尔常量(但仍然在检查territory的有效范围内),并在查询中使用该常量。

另一个选择是按地区过滤。仅当领土不为空时才使用。这也将导致生成更短的sql查询。

var orders = context.Orders;
if (territory != null)
{
    orders = orders.Where(x.Territory != null && x.Territory.Id == territory.Id)
}