首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINQ Skip()问题

LINQ Skip()问题
EN

Stack Overflow用户
提问于 2011-03-10 23:17:08
回答 4查看 5.5K关注 0票数 5

如果itemToSkip大于0,下面的C#语句将阻塞该进程,并且无法检索数据。

代码语言:javascript
复制
 int itemToSkip = 100;
 int itemToTake = 1000;

 var itemList = db.MYTABLEs.Skip(itemToSkip).Take(itemToTake).ToList();

我怎么才能修复它?有什么问题吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-10 23:30:51

不确定您有哪些提供db.MYTABLEs的提供商。除非我们知道db.MYTABLEs是如何运行的,否则无法回答您的问题。

在正常的LINQ中,skip不只是向前跳过;它必须遍历数据量才能跳过。因此,对于您的14 of数据表,它将迭代第一个“跳过”数量的记录。如果这个迭代很慢,那么跳过它并不能节省任何cpu/时间。

对于某些提供程序,例如SQL源,可以使用游标实现跳过,这可能会很慢。如果是SQL Server,可以使用可能更快的关键字对其进行优化。

如果它是LINQ- to - SQL,它会使用“ EXISTS”子句将查询转换成SQL,这将是非常慢的,因为如果NOT EXISTS子句没有命中索引,它必须遍历整个表。请参阅以下内容(link):

SQL通过使用子查询和

NOT EXISTS子句来转换Skip。此翻译有以下限制:

  • 参数必须是集合。即使已排序,也不支持多集。
  • 生成的查询可能比为应用跳过的基本查询生成的查询复杂得多。这种复杂性可能会导致性能下降甚至超时。

换句话说,文档说“不要这样做”。

只有具有随机访问功能的提供者,例如内存中的数组,才会跳过,因为提供者可以跳到前面。

最糟糕的情况是,如果您正在使用Skip/Take自动对整个数据集排序的提供程序上运行。如果你有14 to的数据,那么这种排序将会非常慢。

你需要做更多的实验,看看你的程序是挂起在跳过,还是只占用了所有试图迭代的cpu。

如果您只想将数据分成可管理的块,那么您可能不应该使用跳过/获取,因为它每次都会重新查询数据源。

票数 8
EN

Stack Overflow用户

发布于 2011-03-10 23:20:48

Skip通常坚持有一个明确的排序顺序。试一试

代码语言:javascript
复制
var itemList = db.MYTABLEs.OrderBy(r => r.Id).Skip(itemToSkip)

或者类似的。

票数 3
EN

Stack Overflow用户

发布于 2011-03-10 23:24:43

我假设您的DBMS不支持直接跳过,因此它可能会请求所有数据,这取决于提供程序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5261717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档