Rem*_*us 0 .net c# linq entity-framework
我正在寻找一个异步,.Where()但找不到一个,所以经过一些研究我创造了一个.
public static class LinqExtension
{
public static async Task<IEnumerable<T>> WhereAsync<T>(this IEnumerable<T> source, Func<T, Task<bool>> @delegate)
{
var tasks = source.Select(async t => new
{
Predicate = await @delegate(t).ConfigureAwait(false),
Value = t
}).ToList();
var results = await Task.WhenAll(tasks).ConfigureAwait(false);
IEnumerable<T> typeList = results.Where(pred => pred.Predicate).Select(val => val.Value);
return typeList;
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用它时,我得到运行时错误
无法将隐式bool转换为Task,是的,它是正确的
这就是我尝试过的方式
var q = await context.StockHistories.WhereAsync(x => x.ProductId == productId);
Run Code Online (Sandbox Code Playgroud)
我试过了
context.StockHistories.WhereAsync(Task.Run(() => { x => x.ProductId == productId; }));
Run Code Online (Sandbox Code Playgroud)
但得到
只有赋值,调用,递增,递减和新对象表达式才能用作语句
可以请有人提供解决方案,并解释我做错了什么?
EF的异步方法是执行查询的方法.所以你真正想要的是
var q = await context.StockHistories.Where(x => x.ProductId == productId).ToListAsync();
Run Code Online (Sandbox Code Playgroud)
基本上没有异步Where方法,因为它没有意义,因为它只用于生成将在DB上执行的实际SQL.在迭代结果之前,查询实际上并不运行,并且执行该操作的所有方法都具有异步版本.