【发布时间】:2015-07-31 00:43:50
【问题描述】:
我想编写一个函数,逐页从数据库表中检索数据。这里的目标是节省内存。这是验证程序的一部分,我们将偶尔在数据库上运行它以确保我们拥有一致的数据。表可能很大,所以我不想将整个表加载到内存中进行验证。
考虑到这一点,我编写了这个函数:
static IEnumerable<T> RetreivePages<T>(IQueryable<T> query, int count, int pageSize)
{
int pages = count / pageSize;
if (count % pageSize > 0)
{
pages++;
}
for (int i = 0; i < pages; i++)
{
foreach (T item in query.Skip(i * pageSize).Take(pageSize))
{
yield return item;
}
}
}
这里的想法是我们一次只检索pageSize 行,所以我们不会用表中的所有行来填充内存。
不幸的是,这不起作用。 query.Skip 行抛出以下异常:
“跳过”方法仅支持 LINQ to Entities 中的排序输入。必须在方法“Skip”之前调用方法“OrderBy”。
还有其他方法可以实现我想要的吗?
更新
链接为重复的问题的答案建议按列排序。 .OrderBy 在这里不起作用,因为 T 上的属性在函数内部是未知的。
【问题讨论】:
-
排序很重要,因为在数据库上多次运行相同的 SELECT 会导致不同的数据顺序。
-
@DavidG 我明白了。那么,看起来那个问题没有答案。谢谢!
-
@AlexAtNet 是的。那么你将如何解决这个问题呢?您链接的问题中的解决方案不适用。
-
如果你不能在这个方法中对结果进行排序,你有没有机会在调用它之前这样做?
标签: c# entity-framework