iquerable异步循环



这是一个sql查询:

var query = db.Table1.Where(t => t.age >= 18); 
foreach (var item in query)
{
...
}
var query2 = query.Where(t => t.dept == 1234);
foreach (var item in query2)
{
...
} 

query和query2是可查询对象。这意味着直到foreach循环才执行sql查询。

前面的代码可以正常工作。但是我想知道我可以让这段代码异步。

这是我尝试过的:

var query = db.Table1.Where(t => t.age >= 18); 
var res1 = await query.ToListAsync();
foreach (var item in res1)
{
...
}
var query2 = query.Where(t => t.dept = 1234);
var res2 = await query2.ToListAsync();
foreach (var item in res2)
{
...
} 

它工作,但它是丑陋的我的眼睛,因为我必须在我的代码中添加2行。

所以我的问题是:有没有一种方法可以使循环异步?

像这样:

await foreach (var item in query2.ToListAsync())
{
...
}

感谢

可以在foreach语句中使用await关键字,如下所示:

foreach (var item in await query2.ToListAsync())
{
...
}

你不应该等待呼叫ToListAsync()直接。执行所有的查询,然后等待结果。

UPDATE -错过了链接where for query2

的微妙之处
// base query
var query = db.Table1.Where(t => t.age >= 18);
// execute the base query but do not await the result.
var res1 = query.ToListAsync();
// execute a second query adding an additional filter but do not await the result
var res2 = query.Where(t => t.dept == 1234).ToListAsync();
// process the results of the base query.
foreach (var item in await res1)
{
...
}
// process the results of the second query.
foreach (var item in await res2)
{
...
} 

你的代码中也有几个错误(现在在问题中固定了)

  • query.Where(t => t.dept = 1234);可能应该是query.Where(t => t.dept == 1234);-注意两个相等的相等检查,而不是一个单一的分配(我敢打赌这是一个打字错误)
  • foreach (var item in query2)可能应该是foreach (var item in res2)-调用ToListAsync()并忽略结果没有多大意义。

最新更新