使用LINQ select返回异步任务

时间:2016-06-03 07:46:57

标签: c# linq asp.net-core entity-framework-core .net-core

我想实现从数据库异步返回子项列表的函数。所以我写了一个函数:

    public async Task<IEnumerable<object>> GetFiles(int parentId)
    {
        var data = from file in DB.Files
                   where file.ParentId == parentId
                   select new { name = file.Name, id = file.Id };
        return data;
    }

但是我可以看到一个警告:异步方法las'等待'运算符并将同步运行。如何将此函数重写为异步?

4 个答案:

答案 0 :(得分:4)

您可以使用ToListAsync()

https://msdn.microsoft.com/en-us/library/dn220258(v=vs.113).aspx

var data = await DB.Files
    .Where(file => file.ParentId == parentId)
    .Select
        (
            new 
            { 
                name = file.Name,
                id = file.Id 
            }
        ).ToListAsync();
return data;

可替换地:

var data = from file in DB.Files
           where file.ParentId == parentId
           select new { name = file.Name, id = file.Id };
return await data.ToListAsync();

请注意,这将查询数据。此外,您可以重新考虑您的方法名称。当方法为异步时,naming convention建议您追加&#34; Async&#34;到您的方法名称。

  

按照惯例,你追加&#34; Async&#34;到具有的方法的名称   异步或异步修饰符。

答案 1 :(得分:1)

ToListAsync()方法不再适用于枚举。您可以使用如下的FromResult方法:

var data = from file in DB.Files
           where file.ParentId == parentId
           select new { name = file.Name, id = file.Id };
    return await Task.FromResult(data);

答案 2 :(得分:-1)

在某些情况下,您应该使用Task.run

 public async Task<IEnumerable<object>> GetFiles(int parentId)
    {
        var data = await Task.Run(()=> from file in DB.Files
                   where file.ParentId == parentId
                   select new { name = file.Name, id = file.Id }).ToList();
        return data;
    }

答案 3 :(得分:-2)

您也可以使用TaskCompletionSource -

public static async Task<string> ReturnAsync()
{
    var tsc = new TaskCompletionSource<string>();
    tsc.SetResult("hello world");
    return await tsc.Task;
}