我正在开发一个ac#program,它有一个"IEnumerable users",可以存储400万用户的ID.我需要遍历Ienummerable并每次提取批量1000个ID以在另一个方法中执行某些操作.
如何从Ienumerable开始一次提取1000个ID ...做一些其他事情然后获取下一批1000等等?
这可能吗?
所以,代码非常简单:
var result = dbContext.Skip(x).Take(y).ToList();
Run Code Online (Sandbox Code Playgroud)
当x很大(~1.000.000)时,查询非常慢.y很小 - 10,20.
这个的SQL代码是:(来自sql profiler)
SELECT ...
FROM ...
ORDER BY ...
OFFSET x ROWS FETCH NEXT y ROWS ONLY
Run Code Online (Sandbox Code Playgroud)
问题是,是否有人知道如何加快这种分页?谢谢.
我正在浏览这个问题和一些类似的问题:
很多地方我都读到这样的答案:
我想知道为什么Skip和Take不是数组的恒定时间操作?
反过来,如果它们是常量时间操作,那么Skip和Take方法(最后没有调用ToArray())是否具有相同的运行时间而没有执行Array.Copy的开销,而且空间效率更高?
我正在做一个 POC,将字符串列表分成批次并异步处理每个批次。但是当我运行该程序时,它总是采用第一组项目(根据批量大小为 3)。那么任何人都可以帮助我如何移动到下一组项目。
Take是我写的一个扩展方法。我尝试使用async/await模式。
提前致谢
public class Program
{
public static async Task Main(string[] args)
{
var obj = new Class1();
List<string> fruits = new()
{
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10"
};
await Class1.Start(fruits);
Console.ReadLine();
}
}
public class Class1
{
private const int batchSize = 3;
public static async Task Start(List<string> fruits)
{
if (fruits == null)
return;
var e = fruits.GetEnumerator();
while (true)
{
var batch = e.Take(3); // always …Run Code Online (Sandbox Code Playgroud) c# ×3
.net-core ×1
arrays ×1
asp.net-core ×1
async-await ×1
copy ×1
ienumerable ×1
linq ×1
performance ×1
skip ×1
sql ×1
take ×1