返回LINQ时的c#异步

glo*_*ter 3 c# ado.net lambda asynchronous entity-framework

我刚刚意识到这段代码:

    public async Task<List<Review>> GetTitleReviews(int titleID)
    {
        using (var context = new exampleEntities())
        {
            return await context.Reviews.Where(x => x.Title_Id == titleID).ToList();        
        }
    }
Run Code Online (Sandbox Code Playgroud)

...将无法工作,因为异步方法无法等待LINQ表达式.我做了一些搜索,但只找到了一些过于复杂的解决方案.

如何将返回LINQ表达式的函数转换为异步版本?

sa_*_*213 9

添加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();        
    }
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*iho 5

从技术上讲,该方法不会返回lambda。返回List<Review>

确实,您发布的内容无法编译。但这将:

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

如果那不能回答您的问题,也许您可​​以更清楚地知道您要完成的目标以及上述原因为什么没有做到。

  • 最大的区别在于,另一种解决方案只需要将 EF 加载到一个方法的进程中。如果您已经引用了 EF,这不是一个坏方法。但我不想仅仅为此依赖 EF。 (2认同)
  • 我还应该提到:每个场景都不同,但与将整个表达式包装在“任务”中相比,使用 EF 版本可能存在其他性能问题。在这里,我们只保证 LINQ `Where()` 方法的延迟执行。理想情况下,“评论”属性会很快;它可能被推迟执行,或预先计算。一般来说,我们应该能够假设属性 getter 是快速的。但并不是每个人都遵守这个规则。如果 `ToListAsync()` 之前的表达式元素很慢,则使用 E​​F 方法可能会使代码暴露在不必要的延迟中。 (2认同)