这是一个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()
并忽略结果没有多大意义。