Nhibernate在Query中使用扩展函数

时间:2015-04-01 17:04:03

标签: c# nhibernate

我写了一个查询:

from order in session.Query<ORM.Entities.Order>()
                                  where order.Finishable()
                                  select order);

其中Finishable是一个包含一些返回bool的业务逻辑的方法。

Nhibernate返回System.NotSupportedException:Boolean Finishable()异常。

Finishable()中的逻辑有点复杂。所以我的问题是:

  1. 如何在查询中使用自定义函数?我是否必须更改方法的签名?
  2. 以这种方式做这个甚至是个好主意吗?我也可以尝试重写逻辑以使用nhibernate。这将导致以某种方式重复逻辑。在这种情况下这是不可避免的吗?
  3. 之后我还可以尝试获取计算Finishable()所需的所有数据,因此首先获取所有订单并用数据填充它们,之后我可以按原样使用我的函数。
  4. 那么什么是最佳解决方案?

1 个答案:

答案 0 :(得分:1)

您编写的任何实际命名函数都将由编译器编译,因此LINQ查询提供程序无法使用它。

您需要创建一个代表您所拥有的操作的Expression

您几乎肯定希望使用lambda来创建该表达式,但您不一定需要始终内联这些lambda,这是典型的。您可以创建一个方法/属性/字段,用于存储要向更大范围公开的表达式:

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);