使用 LINQ select 返回异步任务

Rem*_*Rem 5 c# linq entity-framework-core .net-core asp.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;
    }
Run Code Online (Sandbox Code Playgroud)

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

smo*_*nes 7

您可以使用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;
Run Code Online (Sandbox Code Playgroud)

或者:

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

请注意,这将查询数据。此外,您可以重新考虑您的方法名称。当方法是 async 时,命名约定建议您在方法名称后附加“Async”。

按照惯例,您将“Async”附加到具有 Async 或 async 修饰符的方法的名称。


nzr*_*tmn 6

ToListAsync()方法不再与 enumarable 一起使用。您可以使用如下 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);
Run Code Online (Sandbox Code Playgroud)