2

我正在尝试将 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 在委托中不可用。我在这里做错了什么?

4

1 回答 1

0

session.QueryOver().Where(...) 接受一个表达式,因此它将尝试评估您的表达式并将其转换为查询 - 即。它将尝试将 searchParameter(x) == searchParameter(current) 转换为 SQL 查询,但它不知道该怎么做。

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

于 2012-09-05T15:24:16.393 回答