我正在尝试将一些复杂的查询模式包装到扩展方法中,IQueryable<Foo>
并且偶尔需要在其中进行一些外部连接。
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;
}
另一种情况还需要会话访问来执行一些保存操作(是的,是的,副作用很糟糕。它用于跟踪查询模式)。
在第一种情况下,我通过将标签集合作为参数传递来解决这个问题,虽然对于调用者来说有点难看,但工作正常,但显然不能扩展,这是我唯一的另一个选择对于一般情况而言,能够推测出这一点的方法是ISession
直接传入。
我希望有一些可以从扩展方法调用的辅助方法,如下所示:
static ISession GetSession<T> (IQueryable<T> query)
{
// do magic
}
即使它涉及向下转换可查询,或查询提供程序或 Nh* 的东西,我想我更喜欢它而不是传递会话。但我还没有找到访问它的方法(会话属性NhQueryProvider
受保护)。我是否错过了其他一些方法来摆脱这种表达?