【发布时间】:2015-05-20 23:18:55
【问题描述】:
我正在使用 Take and Skip 进行一些测试,我发现:
var objects = (from c in GetObjects() orderby c.Name select c);
var skipTake = objects.Skip(5).Take(10).ToList();
var takeSkip = objects.Take(10).Skip(5).ToList();
GetObjects() 返回一个由 NHibernate(3.3.3GA,使用 SQL Server 2008 R2 DB)生成的 IQueryable。
skipTake 和 takeSkip 包含完全相同的 10 个对象序列。
但是如果我写
var objects = (from c in GetObjects() orderby c.Name select c).ToList();
var skipTake = objects.Skip(5).Take(10).ToList();
var takeSkip = objects.Take(10).Skip(5).ToList();
skipTake 包含与上述示例相同的序列,而 takeSkip 包含不同的序列,仅包含 5 个对象。
Take 和 Skip 调用在应用于 IQueryable 时是否会重新排序?
我很想对此有所了解。
提前致谢。
【问题讨论】:
-
对比度从何而来?
-
第二个听起来像是正确的行为。你的
IQueryable到底来自哪里?这几乎听起来像是任何东西都会在数据源上生成所需的查询并以某种方式弄乱Skip和Take。 -
@Ralf,是的,我在“清理后的代码”中留下了一个错字,现在已更正。 James Thorpe,“IQueryable”来自 NHibernate 查询,难道 NHibernate 正在重新排序 SQL 生成中的调用?
-
将此称为“预期行为”有点牵强。如果提供者不能做正确的事情,它应该失败,而不是做不正确的事情。
-
@Rawling 哦,我同意,我会说这绝对看起来像是他们的一个错误 - 只是说他们可能会争辩说它只是这样设计并记录在案。我不知道这方面的任何一种方式,这不是我使用过的工具。
标签: c# linq nhibernate