实体框架 - Linq - 比较Nullable对象 - NotSupportedException

时间:2015-09-23 14:14:57

标签: c# entity-framework linq linq-to-entities

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

  • 如果territory == null。全部返回Orders
  • 如果来自订单的territory != nullTerritory实体为!= null。返回Orders匹配两个实体的Id属性(PK)。

我有以下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查询以便返回预期结果?

2 个答案:

答案 0 :(得分:4)

试试这个:

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

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

答案 1 :(得分:0)

另一个选项是仅当territory不为null时才按territory.id进行过滤。这也将导致生成更短的sql查询。

var orders = context.Orders;

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