2016-01-22 91 views
9

哪裏ToListAsync()在實體框架7.我如何返回一個集合或使用的SingleOrDefault在EF異步方法7.實體框架7異步收藏

public async Task<IEnumerable<TodoItem>> GetAllAsync() 
    { 
     //TODO: ToListAsync missing?   

     return await _context.Todos.ToAsyncEnumerable(); 
    } 

這是返回一個錯誤不包含定義GetAwaiter? SaveChangesAsync沒有問題。

回答

0

ToListAsync()SingleOrDefaultAsync()藏漢如許多其他異步方法中存在的命名空間Microsoft.Data.Entity這是在EntityFramework.Core包。

+0

通常,我不會調用MyCollection.ToList()(異步或其他),因爲集合將被評估,並且集合會立即放置在內存中。你怎麼能返回一個IEnumberable/IQueryable而不是一個列表,這樣我可以進一步查詢,然後只執行它就可以使用。這就像我們缺少一個ToAsyncEnumerable/ToAsyncQueryable解決方案。 – DanAbdn

+0

@DanAbdn由於'IEnumerable'接口不允許異步,因爲'MoveNext()'不支持任務,而這就是需要異步的位。所以如果你需要使用異步,唯一的方法是'ToListAsync()'。或者你可以使用'.Select(x => x.Id).ToListAsync()'選擇所有的id,然後使用FirstAsync()來獲取每個項目。 –

+0

這會比'ToListAsync'慢很多,因爲每個'FirstAsync'都會是一個新的SQL查詢 –

12

Microsoft.EntityFrameworkCore

命名空間

Microsoft.EntityFrameworkCore命名空間包括async擴展方法。該名稱空間位於Microsoft.EntityFrameworkCore包中。這裏是the source on GitHub,這裏是它的async擴展方法。

  • AnyAsync()
  • AllAsync()
  • CountAsync()
  • LongCountAsync()
  • FirstAsync()
  • FirstOrDefaultAsync()
  • LastAsync()
  • LastOrDefaultAsync()
  • SingleAsync()
  • SingleOrDefaultAsync()
  • MinAsync()
  • MaxAsync()
  • SumAsync()
  • AverageAsync()
  • ContainsAsync()
  • ToListAsync()
  • ToArrayAsync()
  • LoadAsync()
  • ToDictionaryAsync()
  • ForEachAsync()

示例用法

project.json

"Microsoft.EntityFrameworkCore": "1.0.0", 

ApplicationUserRepository.cs

using System; 
using System.Collections.Generic; 
using System.Threading.Tasks; 
using Microsoft.EntityFrameworkCore; 

namespace MyApplication.Models { 
    public class ApplicationUserRepository : IApplicationUserRepository 
    { 
     private ApplicationDbContext _dbContext; 

     public ApplicationUserRepository(ApplicationDbContext dbContext) { 
      _dbContext = dbContext; 
     } 

     public async Task<ApplicationUser> Find(Guid id) 
     { 
      return await _dbContext.Users.SingleAsync(u => u.Id == id); 
     } 

     public async Task<IEnumerable<ApplicationUser>> GetAll() 
     { 
      return await _dbContext.Users.ToListAsync(); 
     } 
    } 
}