如果itemToSkip大于0,下面的C#语句将阻塞该进程,并且无法检索数据。
int itemToSkip = 100;
int itemToTake = 1000;
var itemList = db.MYTABLEs.Skip(itemToSkip).Take(itemToTake).ToList();我怎么才能修复它?有什么问题吗?
发布于 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。
如果您只想将数据分成可管理的块,那么您可能不应该使用跳过/获取,因为它每次都会重新查询数据源。
发布于 2011-03-10 23:20:48
Skip通常坚持有一个明确的排序顺序。试一试
var itemList = db.MYTABLEs.OrderBy(r => r.Id).Skip(itemToSkip)或者类似的。
发布于 2011-03-10 23:24:43
我假设您的DBMS不支持直接跳过,因此它可能会请求所有数据,这取决于提供程序。
https://stackoverflow.com/questions/5261717
复制相似问题