Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nhibernate 在NH3.1中调用Fetch会忽略Skip和Take_Nhibernate_C# 4.0_Paging_Linq To Nhibernate_Nhibernate 3 - Fatal编程技术网

Nhibernate 在NH3.1中调用Fetch会忽略Skip和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结合使用进行分页

我们正试图编写一个用于分页的查询,我们希望使用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