Mat*_*iti 5 c# linq nhibernate
我正在使用Take和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生成的IQueryable(3.3.3GA,使用SQL Server 2008 R2 DB).
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时会重新排序吗?
我很乐意对此有所了解.
提前致谢.
看起来这是由于特定版本的 nhibernate 中的错误造成的:
http://sourceforge.net/p/nhibernate/news/2013/03/nhiberate-333ga-released/
注意:在 3.3.3.CR1 之前的版本中,LINQ Take() 方法的处理存在缺陷 - 无论 Take() 被放置在查询中的哪个位置,它总是被应用,就好像它被放置在末尾一样。3.3.3 修复了这个问题,因此 Take() 现在可以正确遵循 .Net 语义。也就是说,在 3.3.3 中,以下查询现在可能会给出不同的结果:
session.Query<Foo>.OrderBy(...).Take(5).Where(...);
session.Query<Foo>.Where(...).OrderBy(...).Take(5);
从 3.3.3 开始,第一个查询将生成一个子查询,以在 where 子句之前正确应用行限制。