Nhibernate 在查询中使用扩展函数
Nhibernate use extension functions in Query
我写了一个查询:
from order in session.Query<ORM.Entities.Order>()
where order.Finishable()
select order);
其中 Finishable 是一个包含一些业务逻辑的方法,returns 一个 bool。
Nhibernate 正在返回一个 System.NotSupportedException: Boolean Finishable() 异常。
Finishable() 中的逻辑有点复杂。所以我的问题是:
- 如何允许在查询中使用自定义函数?我必须更改方法的签名吗?
- 这样做是不是一个好主意?我也可以尝试重写逻辑以使用 nhibernate。这将导致以某种方式重复逻辑。在这种情况下这是不可避免的吗?
- 之后我还可以尝试获取计算 Finishable() 所需的所有数据,因此首先获取所有订单并用数据填充它们,然后我可以按原样使用我的函数。
那么最好的解决方案是什么?
您编写的任何实际命名函数都将由编译器编译,因此实际上无法被 LINQ 查询提供程序使用。
您需要创建一个 Expression
来表示您拥有的操作。
您几乎肯定想使用 lambda 来创建该表达式,但您不一定需要总是 内联 这些 lambda,这很典型。您可以创建一个 method/property/field 来存储您希望暴露给更大范围的表达式:
public class Order
{
//consider renaming as appropriate
public static Expression<Func<Order, bool>> Finishable
{
get
{
//TODO change logic in lambda as needed
return order => order.Status == "Finished";
}
}
}
然后你可以写:
var query = session.Query<ORM.Entities.Order>()
.Where(ORM.Entities.Order.Finishable);
我写了一个查询:
from order in session.Query<ORM.Entities.Order>()
where order.Finishable()
select order);
其中 Finishable 是一个包含一些业务逻辑的方法,returns 一个 bool。
Nhibernate 正在返回一个 System.NotSupportedException: Boolean Finishable() 异常。
Finishable() 中的逻辑有点复杂。所以我的问题是:
- 如何允许在查询中使用自定义函数?我必须更改方法的签名吗?
- 这样做是不是一个好主意?我也可以尝试重写逻辑以使用 nhibernate。这将导致以某种方式重复逻辑。在这种情况下这是不可避免的吗?
- 之后我还可以尝试获取计算 Finishable() 所需的所有数据,因此首先获取所有订单并用数据填充它们,然后我可以按原样使用我的函数。
那么最好的解决方案是什么?
您编写的任何实际命名函数都将由编译器编译,因此实际上无法被 LINQ 查询提供程序使用。
您需要创建一个 Expression
来表示您拥有的操作。
您几乎肯定想使用 lambda 来创建该表达式,但您不一定需要总是 内联 这些 lambda,这很典型。您可以创建一个 method/property/field 来存储您希望暴露给更大范围的表达式:
public class Order
{
//consider renaming as appropriate
public static Expression<Func<Order, bool>> Finishable
{
get
{
//TODO change logic in lambda as needed
return order => order.Status == "Finished";
}
}
}
然后你可以写:
var query = session.Query<ORM.Entities.Order>()
.Where(ORM.Entities.Order.Finishable);