2016-01-22 30 views
9

私はEFで非同期メソッドを使用してコレクションまたはSingleOrDefaultを返すにはどうすればよいEntity Frameworkの7のToListAsync()である7Entity Frameworkの7非同期コレクション

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

     return await _context.Todos.ToAsyncEnumerable(); 
    } 

これは、の定義が含まれていないエラーが返されますGetAwaiter? SaveChangesAsyncは問題ありません。他の非同期メソッドの多くとして

答えて

0

ToListAsync()SingleOrDefaultAsync() aswellはEntityFramework.Coreパッケージ内にある名前空間Microsoft.Data.Entityに存在します。

+0

通常、コレクションの評価とコレクションの即時メモリへの配置に合わせてMyCollection.ToList()(asyncなど)を呼び出すことはありません。リストではなくIEnumberable/IQueryableを返すことができます。このようにしてクエリを実行し、実行するだけですぐに使用できます。 ToAsyncEnumerable/ToAsyncQueryableソリューションが欠けているようです。 – DanAbdn

+0

@DanAbdn 'MoveNext()'はタスクをサポートしていないので、非同期にする必要があるビットであるため、 'IEnumerable'インターフェイスは非同期を許可しないので、あなたのやり方をすることはできません。したがって、非同期を使用する必要がある場合、唯一の方法は 'ToListAsync()'でしょう。あるいは、 '.Select(x => x.Id).ToListAsync()'を使ってすべてのidを選択し、 'FirstAsync()'を使って各項目を取得することができます。 –

+0

これは 'ToAsAsync'よりも遅くなります。それぞれの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(); 
     } 
    } 
}