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;