Nhibernate 在NH3.1中调用Fetch会忽略Skip和Take
我们正试图编写一个用于分页的查询,我们希望使用Fetch为一个对象加载一个集合,然后返回该对象的分页列表。下面的查询不起作用,因为当我们在探查器中查看时,它跳过了Skip and Take设置,只返回对象列表(急切加载):Nhibernate 在NH3.1中调用Fetch会忽略Skip和Take,nhibernate,c#-4.0,paging,linq-to-nhibernate,nhibernate-3,Nhibernate,C# 4.0,Paging,Linq To Nhibernate,Nhibernate 3,我们正试图编写一个用于分页的查询,我们希望使用Fetch为一个对象加载一个集合,然后返回该对象的分页列表。下面的查询不起作用,因为当我们在探查器中查看时,它跳过了Skip and Take设置,只返回对象列表(急切加载): var result=\u repository.All() .Skip(10) .Take(10) .Fetch(mf=>mf.Tags); 所有内容都会编译和执行,但跳过和执行部分会被忽略,所有数据都会被带回。可以将Fetch与Skip and Take结合使用进行分页
var result=\u repository.All()
.Skip(10)
.Take(10)
.Fetch(mf=>mf.Tags);
所有内容都会编译和执行,但跳过和执行部分会被忽略,所有数据都会被带回。可以将Fetch与Skip and Take结合使用进行分页吗?您是否尝试在Skip and Take之前调用Fetch
var result = _repostitory.All<MediaFile>()
.Fetch(mf => mf.Tags)
.Skip(10)
.Take(10);
因此.Take(2)将返回一个包含两个子对象(Id 1)的对象。您希望返回前两个对象(Id 1,2)及其子对象的位置 我试着把取回放在箕斗之前,取走之后。我还是得到了同样的结果。这不应该是SQL的限制,因为在实体框架中有一个等价的方法,名为Include,它允许您加载不同的关系,并且工作正常。它看起来是特定于NHibernate LINQ提供程序的。默认情况下,获取转换为SQL连接。联接将生成两个表的笛卡尔乘积,并且skip/take只能应用于父表。唯一的方法是使用两个查询,一个用于父对象,另一个用于子对象。其他任何东西都会产生错误的结果。不确定EF如何处理这个问题。您可以在映射中使用.Fetch.Subselect()&&.Not.LazyLoad()进行体验(假设您使用的是Fluent Nhibernate)。这将导致使用两个sql查询,我从未尝试过在NH3.1Nhibernate中使用新的Linq。如果不执行两个查询,则标准对象支持此功能。我不明白为什么加入会影响跳转和跳转。例如,“Take”转换为“selecttopx”SQL语句。这将在标准选择或加入中起作用。谢谢。。。该示例阐明了它。顺便问一下,映射FluentNhibernate或xml文件使用什么。
var result = _repostitory.All<MediaFile>()
.Fetch(mf => mf.Tags)
.Skip(10)
.Take(10);
TableA
-------------
Id|Value
-------------
1 |Value1
2 |Value2
3 |Value3
TableB
-------------------------
ChildId|ParentId|ChildValue
-------------------------
1 | 1|Value1
2 | 1|Value2
3 | 2|Value3
4 | 2|Value4
5 | 3|Value5
6 | 3|ValueA
7 | 3|ValueA
8 | 3|ValueA
SELECT * FROM TableA LEFT JOIN TableB ON TableA.Id = TableB.ParentId
Result
--------------------------------------
Id|Value |ChildId|ParentId|ChildValue
--------------------------------------
1 |Value1|1 | 1|Value1
1 |Value1|2 | 1|Value2
2 |Value1|3 | 2|Value3
2 |Value1|4 | 2|Value4
3 |Value1|5 | 3|Value5
3 |Value1|6 | 3|ValueA
3 |Value1|7 | 3|ValueA
3 |Value1|8 | 3|ValueA
SELECT TOP 2 * FROM TableA LEFT JOIN TableB ON TableA.Id = TableB.ParentId
Result
--------------------------------------
Id|Value |ChildId|ParentId|ChildValue
--------------------------------------
1 |Value1|1 | 1|Value1
1 |Value1|2 | 1|Value2