Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#返回LINQ时异步_C#_Entity Framework_Asynchronous_Lambda_Ado.net - Fatal编程技术网

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版本可能会有其他性能问题,而不是将整个表达式包装在
任务中。在这里,我们只保证LINQ
Where()
方法的延迟执行。理想情况下,
Reviews
属性将是快速的;它可能是延迟执行或预计算的。一般来说,我们应该能够假设属性获取程序是快速的。但并非所有人都遵循这一规则。如果
ToListAsync()
之前的表达式元素速度较慢,使用EF方法可能会使代码暴露在不必要的延迟中。尽管您和Peter Duniho的答案都有效,我将您的标记为答案,因为它提供了与我的原始代码相当的内置
Async
-等效方法。该命名空间中有许多
Async
扩展,在使用
EntityFramework
时非常方便,
FirstOrDefaluAsync
ForEachAsync
是我的一些日常使用