2012-09-05 29 views
2

我试图将一个NHibernate会话对象的IQueryOver接口与LINQ表达式一起用作选择静态类中的记录的标准。的LINQ表达式在一个映射类如Expression<Func<T, object>>定义得到的值的对象T:通过扩展映射类NHibernate:与IQueryOver一起使用LINQ表达式

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

这些参数被添加:

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

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

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以某种方式在委托中不可用。我在这里做错了什么?

回答

0

session.QueryOver()。其中​​(...)需要一个表达式,所以它会尝试评估你的表达式并将其转换为查询 - 即。它会尝试将searchParameter(x)== searchParameter(current)转换为一个SQL查询,它不知道该怎么做。

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