Linq 我可以从IQueryable访问NHibernate ISession实例吗?

Linq 我可以从IQueryable访问NHibernate ISession实例吗?,linq,nhibernate,Linq,Nhibernate,我正在尝试将一些复杂的查询模式封装到IQueryable上的扩展方法中,并且偶尔需要在其中进行一些外部连接 static IQueryable<Foo> Filter(this IQueryable<Foo> foos, params string[] searchTerms) { //... return from t in session.Query<Tags>() from f in foos

我正在尝试将一些复杂的查询模式封装到
IQueryable
上的扩展方法中,并且偶尔需要在其中进行一些外部连接

static IQueryable<Foo> Filter(this IQueryable<Foo> foos, params string[] searchTerms)
{
    //...
    return from t in session.Query<Tags>()
           from f in foos
           where
               (t.Name.Contains (searchTerms[0] && f.Tags.Contains(t))
               || f.Name.Contains(searchTerms[0]
           select f;
}

即使它涉及向下转换可查询项、查询提供程序或其他内容到Nh*我想我更喜欢它而不是传入会话。但我还没有找到访问此文件的方法(NhQueryProvider上的session属性受保护)。我是否错过了从表达式中提取这一信息的其他方法?

我相信使用-
您将定义一个方法,该方法接受
ISession
参数并调用对其的查询
您可以使用查询对象的属性定义不同的搜索词,而不是求助于字符串数组解决方案


Ayende有一点

您必须使用反射:

IQueryable<Product> query = Session.Query<Product>();
ISession session = query.Provider.GetType().GetProperty("Session", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(query.Provider, null) as ISession;
IQueryable query=Session.query();
ISession session=query.Provider.GetType().GetProperty(“session”,BindingFlags.NonPublic | BindingFlags.Instance”).GetValue(query.Provider,null)作为ISession;

我不明白这将如何帮助我避免使用字符串数组(或者我为什么要这样做)。我有一个可变长度的术语列表,我想在其上获得一组析取匹配项。我认为您唯一的选择是通过反射访问会话属性。就我个人而言,我宁愿通过这次会议,然后依靠黑客。是的,这肯定比反思更可取。只是希望有其他的方法来抓住它。谢谢
IQueryable<Product> query = Session.Query<Product>();
ISession session = query.Provider.GetType().GetProperty("Session", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(query.Provider, null) as ISession;