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() 中的逻辑有点复杂。所以我的问题是:

  1. 如何允许在查询中使用自定义函数?我必须更改方法的签名吗?
  2. 这样做是不是一个好主意?我也可以尝试重写逻辑以使用 nhibernate。这将导致以某种方式重复逻辑。在这种情况下这是不可避免的吗?
  3. 之后我还可以尝试获取计算 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);