返回LINQ时的c#异步

时间:2014-10-30 01:53:23

标签: 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();        
        }
    }

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

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

3 个答案:

答案 0 :(得分:8)

添加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();        
    }
}

答案 1 :(得分: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());
    }
}

如果这不能回答你的问题,也许你可以更清楚地知道你想要完成什么,以及为什么上面没有这样做。

答案 2 :(得分:0)

我通过创建 Enumerable 扩展解决了这个问题。这对我来说是必需的,因为 Xamarin Forms 没有 Linq ToListAsync 支持。这是我的扩展:

public static class EnumerableExtension
{
    public static Task<List<T>> ToListAsync<T>(this IEnumerable<T> enumerable)
    {
        return Task.Run(enumerable.ToList);
    }
}