Entity Framework - Linq - 比较可空对象 - NotSupportedException
Entity Framework - Linq - Comparing Nullable objects - NotSupportedException
我需要将一个对象与我传入的参数进行比较。逻辑是:
- 如果
territory == null
。 Return全部Orders
- 如果
territory != null
并且订单中的 Territory
实体是 != null
。 Return 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
和消息:
Unable to create a constant value of type 'ENTITY'. Only primitive types or
enumeration types are supported in this context.
虽然我理解错误,因为我没有传递原始类型。如何更改 LINQ 查询以使其 returns 达到预期结果?
试试这个:
var t = territory == null;
var orders = context.Orders.Where(x =>
t || (x.Territory != null && x.Territory.Id == territory.Id));
这背后的原因是它试图将 territory
转换为 SQL 查询中的常量,但当然 territory
不是原始类型或服务器上的任何等效类型,因此它会抛出例外。但是,您可以在外部缓存常量布尔值(但仍在检查 territory
的有效范围内)并在查询中使用该常量。
另一种选择是仅在地区不为空时按 territory.id 过滤。这也会导致生成更短的 sql 查询。
var orders = context.Orders;
if (territory != null)
{
orders = orders.Where(x.Territory != null && x.Territory.Id == territory.Id)
}
我需要将一个对象与我传入的参数进行比较。逻辑是:
- 如果
territory == null
。 Return全部Orders
- 如果
territory != null
并且订单中的Territory
实体是!= null
。 ReturnOrders
匹配两个实体的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
和消息:
Unable to create a constant value of type 'ENTITY'. Only primitive types or enumeration types are supported in this context.
虽然我理解错误,因为我没有传递原始类型。如何更改 LINQ 查询以使其 returns 达到预期结果?
试试这个:
var t = territory == null;
var orders = context.Orders.Where(x =>
t || (x.Territory != null && x.Territory.Id == territory.Id));
这背后的原因是它试图将 territory
转换为 SQL 查询中的常量,但当然 territory
不是原始类型或服务器上的任何等效类型,因此它会抛出例外。但是,您可以在外部缓存常量布尔值(但仍在检查 territory
的有效范围内)并在查询中使用该常量。
另一种选择是仅在地区不为空时按 territory.id 过滤。这也会导致生成更短的 sql 查询。
var orders = context.Orders;
if (territory != null)
{
orders = orders.Where(x.Territory != null && x.Territory.Id == territory.Id)
}