NHibernate查询映射集合

时间:2010-08-28 15:59:37

标签: linq nhibernate paging linq-to-nhibernate

在我的ASP.NET网络应用程序中,我使用NHibernate来保存我的“用户” - 实例,其中每个人都有一个“条目” - 集合。这是一个典型的一对多映射,它工作得很好。条目的映射代码如下所示:

<bag name="Entries" cascade="all-delete-orphan">
   <key column="UserID" />
   <one-to-many class="MyApp.Entities.Entry, MyApp.Entities" />
</bag>

现在我有一个页面,我想在其中显示一个网格,其中包含登录用户的所有条目。为此,我可以简单地将当前用户的“Entries”属性绑定到Grids“DataSource”属性。这也很好,但这也意味着,网格内置的分页功能(Telerik RadGrid)对数据库性能没有任何影响,因为每次显示网格时都会加载所有条目。 / p>

因此我可以应用我的自定义分页,我只需要获取显示网格当前页面所需的行。典型的Linq2NHibernate查询如下所示:

var query = from entry in Session.Linq<Entry>()
                    where entry.User == currentUser
                    select entry;
query.Skip(pageNum * pageSize).Take(pageSize).ToList();

使用这种方法我需要扩展我的存储库,尽管NHibernate已经完成了用户和条目之间的映射......

我的问题是:如果我使用LINQ直接查询“条目” - 收集我的“用户” - 对象 - 这是否意味着,所有条目都将从数据库加载,然后在内存中过滤或者这样被翻译成一个真正的“数据库”-query,以便我可以使用这种更舒适的方法来实现分页?

示例:

myGrid.DataSource = currentUser.Entries.Skip(pageNum * pageSize).Take(pageSize).ToList();

J4I:我当然在映射文件中使用延迟加载......

提前谢谢!

1 个答案:

答案 0 :(得分:0)

集合上的LINQ将始终是LINQ到对象,因为它们没有实现IQueryable,因此您将在内存中加载所有内容。

此时查询是唯一可行的方法。