web-dev-qa-db-ja.com

FindAsyncおよびInclude LINQステートメント

私が今までに持っているコードは正常に動作します

public async Task<ActionResult> Details(Guid? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            ItemDetailModel model = new ItemDetailModel();
            model.Item = await db.Items.FindAsync(id);
            if (model.Item == null)
            {
                return HttpNotFound();
            }           
            return View(model);
        }

しかし、さらに1つのテーブルを含めたいので、FindAsyncを使用できません

public async Task<ActionResult> Details(Guid? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            ItemDetailModel model = new ItemDetailModel();
            model.Item = await db.Items.Include(i=>i.ItemVerifications).FindAsync(id);


            if (model.Item == null)
            {
                return HttpNotFound();
            }           

            return View(model);
        }

だから私はこのエラーに直面しています

重大度コード説明プロジェクトファイル行抑制状態エラーCS1061「IQueryable」には「FindAsync」の定義が含まれておらず、タイプ「IQueryable」の最初の引数を受け入れる拡張メソッド「FindAsync」が見つかりません(usingディレクティブまたはアセンブリ参照?)

それを修正する手がかりはありますか?

21
Developer

最も簡単なのは、代わりにFirstOrDefaultAsyncまたはSingleOrDefaultAsyncを使用することです:

model.Item = await db.Items.Include(i => i.ItemVerifications)
    .FirstOrDefaultAsync(i => i.Id == id.Value);

エラーが発生する理由は、Find/FindAsyncメソッドがDbSet<T>、ただしIncludeの結果はIQueryable<T>

別の方法は、FindAsync明示的な読み込み と組み合わせることです。

model.Item = await db.Items.FindAsync(id);
if (model.Item == null)
{
    return HttpNotFound();
}
await db.Entry(model.Item).Collection(i => i.ItemVerifications).LoadAsync();    
45
Ivan Stoev

汎用リポジトリを使用していて、実行時のPKがわからない場合、このアプローチは役立ちます。

public interface IGenericRepository<TEntity> where TEntity : class
{
    Task<TEntity> Get(int id, string[] paths = null);
}

public class GenericRepository<TEntity> : IGenericRepository<TEntity> where TEntity : class
{
    private readonly ApplicationDbContext _context;
    private readonly DbSet<TEntity> _dbSet;

    public GenericRepository(ApplicationDbContext context)
    {
        _context = context;
        _dbSet = _context.Set<TEntity>();
    }

    public async Task<TEntity> Get(int id, string[] paths = null)
    {
        var model = await _dbSet.FindAsync(id);
        foreach (var path in paths)
        {
            _context.Entry(model).Reference(path).Load();
        }
        return model;
    }
}
4
sbroccardi