NHibernate 3.0中的LINQ提供者是否尊重全局抓取规则?

NHibernate 3.0中的LINQ提供者是否尊重全局抓取规则?,nhibernate,linq-to-nhibernate,Nhibernate,Linq To Nhibernate,我刚刚将我的项目更新为NHibernate 3.0,并且我正在尝试将一些条件语句转换为LINQ语句。除了新的LINQ语句似乎不遵守我在映射文件(使用FluentNHibernate)中声明的抓取规则之外,一切似乎都正常工作 例如: public UserMap { Id(x => x.Id); References(x => x.Course).Fetch.Join(); } 现在我像这样查询所有用户: var users = Session.Query<Us

我刚刚将我的项目更新为NHibernate 3.0,并且我正在尝试将一些条件语句转换为LINQ语句。除了新的LINQ语句似乎不遵守我在映射文件(使用FluentNHibernate)中声明的抓取规则之外,一切似乎都正常工作

例如:

public UserMap
{
    Id(x => x.Id);
    References(x => x.Course).Fetch.Join();
}
现在我像这样查询所有用户:

var users = Session.Query<User>().ToList();
var users=Session.Query().ToList();

我希望返回的集合是数据库中的所有用户,他们的课程属性被急切地加载,这正是我在使用Criteria语句时得到的结果。但是,当使用LINQ提供程序时,NH生成的查询不包括课程表上的联接,因此必须延迟加载所有课程。这是预期的行为吗?如果是这样,我如何让NHibernate遵守映射中声明的获取规则?

不,它们不遵守。您必须使用
Fetch
/
然后Fetch
FetchMany
/
然后FetchMany
明确指定即时抓取。不,它们没有。您必须使用
Fetch
/
然后Fetch
FetchMany
/
然后FetchMany
显式指定即时抓取。我也有同样的问题和类似的解决方法,将规范发送到存储库。每个规范都有一个指定标准的lamda表达式。 以前的Linq提供程序尊重这些映射,为什么新的不尊重呢?或者至少默认为定义了可以覆盖的映射?
有没有办法修正这个缺点?

我也有同样的问题和类似的解决方法,并将规范发送到存储库。每个规范都有一个指定标准的lamda表达式。 以前的Linq提供程序尊重这些映射,为什么新的不尊重呢?或者至少默认为定义了可以覆盖的映射?
有没有办法修正这个缺点?

这对我来说是不可能的,因为我将IQueryable作为一个属性公开在我的Web项目所使用的IDataContext接口上(它没有NHibernate的引用,也不应该关心获取策略)。这对我来说是不可能的,因为我将IQueryable公开为我的Web项目所使用的IDataContext接口上的一个属性(该接口没有对NHibernate的引用,也不应该关心获取策略)。