在我的 ASP.NET Web 应用程序中,我使用 NHibernate 来保存我的“用户”实例,其中每个实例都有一个“条目”集合。这是典型的一对多映射,并且工作得很好。条目的映射代码如下所示:
<bag name="Entries" cascade="all-delete-orphan">
<key column="UserID" />
<one-to-many class="MyApp.Entities.Entry, MyApp.Entities" />
</bag>
现在我有一个页面,我想在其中显示一个包含登录用户的所有条目的网格。为此,我可以简单地将当前用户的“Entries”属性绑定到网格“DataSource”属性。这也很好用,但这也意味着网格内置分页功能(Telerik RadGrid)对数据库性能没有任何影响,因为每次显示网格时都会加载所有条目。
因此,我可以应用自定义分页,其中我只获取显示网格当前页面所需的行。典型的 Linq2NHibernate 查询如下所示:
var query = from entry in Session.Linq<Entry>()
where entry.User == currentUser
select entry;
query.Skip(pageNum * pageSize).Take(pageSize).ToList();
使用这种方法我需要扩展我的存储库,尽管 NHibernate 已经完成了 User 和 Entry 之间的映射...
我的问题是:如果我使用 LINQ 直接查询“用户”对象的“条目”集合,这是否意味着所有条目将从数据库加载,然后在内存中过滤,或者是否会被翻译到真正的“数据库”查询,以便我可以使用这种更舒适的方法来实现分页?
示例:
myGrid.DataSource = currentUser.Entries.Skip(pageNum * pageSize).Take(pageSize).ToList();
J4I:当然我在映射文件中使用延迟加载......
提前谢谢您!
集合上的 LINQ 将始终是 LINQ 到对象,因为它们不实现 IQueryable,因此您将在内存中加载所有内容。
查询是目前唯一可能的方法。