如何通过faç设置NHibernate Linq获取策略;ade层

如何通过faç设置NHibernate Linq获取策略;ade层,nhibernate,linq-to-nhibernate,fetching-strategy,facade,Nhibernate,Linq To Nhibernate,Fetching Strategy,Facade,我使用NHibernate进行数据访问,但是通过一个façade层访问它。该层包括存储库的接口,以及与ISession对象相对应的IUnitOfWork接口 为了正确管理检索到的实体,存储库将在其构造函数中传递一个IUnitOfWork,并使用该IUnitOfWork进行加载 IUnitOfWork包含一个名为All的属性,该属性将类的所有实体检索为IQueryable(用于以后的筛选)。因此,检索今年创建的所有实体的存储库方法可能如下所示: NB:这不是这些接口和类的完整代码!只有与我的问题相

我使用NHibernate进行数据访问,但是通过一个façade层访问它。该层包括存储库的接口,以及与ISession对象相对应的IUnitOfWork接口

为了正确管理检索到的实体,存储库将在其构造函数中传递一个IUnitOfWork,并使用该IUnitOfWork进行加载

IUnitOfWork包含一个名为All的属性,该属性将类的所有实体检索为IQueryable(用于以后的筛选)。因此,检索今年创建的所有实体的存储库方法可能如下所示:

NB:这不是这些接口和类的完整代码!只有与我的问题相关的代码

i工作界面:

IQueryable<T> GetList<T>();
public IQueryable<T> GetList<T>()
{
  return _session.Linq<T>();
}
映射文件指定Bar是延迟加载的,但是在我的ThisYearsFos存储库属性中,我想指定Bar应该被急切地加载,以避免N+1选择

在Linq to NHibernate中,我们可以使用Expand()扩展方法指定即时抓取。但是,此扩展方法属于NHibernateQueryable类型,而IUnitOfWork接口的GetList方法只知道IQueryable

显然,我不希望IUnitOfWork接口了解INHibernateQueryable,因为它应该不了解NHibernate

使用我在上面指定的设计,有没有一种方法是我想不出来的?还是我的设计需要重新思考

谢谢


大卫

你说了一些相互矛盾的话: -您不想公开接口 -您希望使用该接口

这是不可能的。你必须重新考虑你的设计。 你用“工作单位”这个词来表示与大多数人不同的事情。
大多数人都希望工作单元接口具有提交和回滚方法,但没有一些IQueryable。

升级到NHibernate 3.x。Expand(
Fetch
)对应的新方法在IQueryable上运行。

我还没有为这些类和接口指定完整的代码!只有与我的问题相关的部分!这对于工作单位是有意义的。我仍然认为你必须重新考虑你的设计,因为你想要解决矛盾的事情。我不认为我试图做矛盾的事情。你能告诉我你的意思吗?你说你想在一个类之外使用一些功能,而你不想在这个类之外公开这些功能。我不知道如何更好地解释它。迭戈的建议可能会满足你的要求。我想从某种意义上说,你所说的是我问题的核心。我只想公开IQueryable(因为它不是特定于NHibernate的),但我想要的功能无法通过IQueryable获得——正如Diego所说,NHibernate 3中除外。但我也感兴趣的是,这个问题是否源于糟糕的设计。(我怀疑可能是这样。)这就是答案!NHibernate 3在哪个州?
IQueryable<Foo> All { get; }
IEnumerable<Foo> ThisYearsFoos{ get; }
public IQueryable<Foo> All
{
  get { return _unitOfWork.GetList<Foo>(); }
}

public IEnumerable<Foo> ThisYearsFoos
{
  get { return All.Where(x => x.DateCreated > new DateTime(2010,1,1);}
}
public class Foo
{
    public Bar {get;set;}
}