c#返回LINQ时异步
我刚刚意识到以下代码:c#返回LINQ时异步,c#,entity-framework,asynchronous,lambda,ado.net,C#,Entity Framework,Asynchronous,Lambda,Ado.net,我刚刚意识到以下代码: public async Task<List<Review>> GetTitleReviews(int titleID) { using (var context = new exampleEntities()) { return await context.Reviews.Where(x => x.Title_Id == titleID).ToList();
public async Task<List<Review>> GetTitleReviews(int titleID)
{
using (var context = new exampleEntities())
{
return await context.Reviews.Where(x => x.Title_Id == titleID).ToList();
}
}
public异步任务GetTitleReviews(int titleID)
{
使用(var context=newexampleEntities())
{
return wait context.Reviews.Where(x=>x.Title_Id==titleID.ToList();
}
}
…将无法工作,因为异步方法无法等待LINQ表达式。我做了一些搜索,但只找到了一些过于复杂的解决方案
返回LINQ表达式的函数应该如何转换为异步版本?从技术上讲,该方法不返回lambda。它返回一个
列表
你发布的内容确实无法编译。但这将:
public async Task<List<Review>> GetTitleReviews(int titleID)
{
using (var context = new exampleEntities())
{
return await Task.Run(() => context.Reviews.Where(x => x.Title_Id == titleID).ToList());
}
}
public异步任务GetTitleReviews(int titleID)
{
使用(var context=newexampleEntities())
{
return wait Task.Run(()=>context.Reviews.Where(x=>x.Title\u Id==titleID.ToList());
}
}
如果这还不能回答您的问题,也许您可以更清楚地了解您正试图实现什么以及为什么上面的方法无法实现。添加
System.Data.Entity
名称空间,并利用Async
扩展方法
在这种情况下,ToListAsync
应该可以做到这一点
using System.Data.Entity;
public async Task<List<Review>> GetTitleReviews(int titleID)
{
using (var context = new exampleEntities())
{
return await context.Reviews.Where(x => x.Title_Id == titleID).ToListAsync();
}
}
使用System.Data.Entity;
公共异步任务GetTitleReviews(int titleID)
{
使用(var context=newexampleEntities())
{
return wait context.Reviews.Where(x=>x.Title_Id==titleID.toListSync();
}
}
您可能想说LINQ扩展方法,而不是“lambdas”?使用System.Data.Entity添加,并使用ToListSync()
@zerkms正确,更新我刚刚尝试了您和@sa_ddam213的解决方案,两种方案都很有效,但他的解决方案似乎更简单。您的解决方案在后端有何区别?最大的区别在于,另一个解决方案只需要为一种方法将EF加载到流程中。如果您已经引用了EF,那么这是一个不错的方法。但是我不想仅仅因为这个就依赖于EF。我还应该提到:每个场景都不同,但是使用EF版本可能会有其他性能问题,而不是将整个表达式包装在任务中。在这里,我们只保证LINQWhere()
方法的延迟执行。理想情况下,Reviews
属性将是快速的;它可能是延迟执行或预计算的。一般来说,我们应该能够假设属性获取程序是快速的。但并非所有人都遵循这一规则。如果ToListAsync()
之前的表达式元素速度较慢,使用EF方法可能会使代码暴露在不必要的延迟中。尽管您和Peter Duniho的答案都有效,我将您的标记为答案,因为它提供了与我的原始代码相当的内置Async
-等效方法。该命名空间中有许多Async
扩展,在使用EntityFramework
时非常方便,FirstOrDefaluAsync
和ForEachAsync
是我的一些日常使用