NHibernate:在IQueryOver中使用LINQ表达式

时间:2012-09-05 13:18:07

标签: linq nhibernate

我正在尝试将NHibernate会话对象的IQueryOver接口与LINQ表达式一起用作选择静态类中记录的条件。 LINQ表达式在映射类中定义为Expression<Func<T, object>>,以获取对象T的值:

public void SearchParameter(Expression<Func<T, object>>)

通过扩展映射类来添加这些参数:

public MyMapping : FindMap<MyNHibernateMappedObject>
{
    public MyMapping()
    {
        this.SearchParameter(x => x.SomeColumn);
    }
}

我的Find类定义了用于在时间轴上获取相同类型的上一个和下一个记录的静态方法。每个搜索参数在两个记录中都必须相同。

Find类从映射配置中获取搜索参数,并使用.Compile()编译表达式。所以我有GetQueryWithSearchParameters方法:

private static Func<T, object> searchParameter;

...

public static IQueryOver<T, T> GetQueryWithSearchParameters(ISession session, T current)
{
    var query = session.QueryOver<T>()
                       .Where(x => searchParameter(x) == searchParameter(current));
    return query;
}

然而,在构建查询时,我得到以下异常:

System.InvalidOperationException: variable 'x' of type MyNHibernateMappedObject' referenced from scope '', but it is not defined

我不确切知道这里发生了什么,但我怀疑代表中的x不可用。我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

session.QueryOver()。Where(...)接受一个表达式,所以它会尝试计算你的表达式并将其翻译成一个查询 - 即。它会尝试将searchParameter(x)== searchParameter(current)转换为SQL查询,它不知道该怎么做。

要使其工作,您需要在代码中构造表达式(不使用lambda表达式)。但是我认为这将是一个痛苦的练习,我认为你会发现构建Criterion并将其添加到QueryOver更容易。