質問: 私のプロジェクトではAutomapper(8.0)DIパターンを使用しており、Entity Framework CoreエンティティクエリでProjectToの使用を開始しようとしています。 これが私がなんとか仕事に取り掛かった例です: ``` public async Task> GetStuffAsync() { return await _dbContext.SomeEntity .ProjectTo(_mapper.ConfigurationProvider) .ToListAsync(); } ``` 上記の呼び出しは予想されるすべてのレコードを返しますが、リポジトリのコンストラクターにIMapperを注入することと、AutoMapper.QueryableExtensionsへの参照を使用することの両方が必要です。 私が見つけたAutoMapperドキュメントには2つのバージョンがあり、競合する情報を提供しているようです。 これらのドキュメントは次のように述べています: > DIの使用は、IQueryable.ProjectTo拡張メソッドの使用と実質的に相互に排他的です。代わりにIEnumerable.Select(_mapper.Map).ToList()を使用してください。 > > そして、これらのドキュメントhttp://docs.automapper.org/en/stable/Dependency-injection.htmlはこれを述べています: > 8.0以降、IMapper.ProjectToを使用できます。古いバージョンでは、構成を拡張メソッドIQueryable.ProjectTo(IConfigurationProvider)に渡す必要があります。 > > 最初のドキュメントの例に従って、クエリを次のように変換しました。 ``` public IEnumerable GetStuff() { return _dbContext.SomeEntity .Select(_mapper.Map) .ToList(); } ``` ただし、このメソッドは0レコード(以前はすべてを返しました)を返し、ToListAsync()は拡張Selectでサポートされていなかったため、メソッドを非同期から同期に変換する必要がありました。明らかに何かが欠けています。また、拡張メソッドに構成を渡さずにバージョン8.0のIMapper.ProjectToを使用することについて2番目のドキュメントセットが話しているため、それが正しい手法かどうかはわかりません。それ、どうやったら出来るの?
回答: > 8.0以降では、IMapper.ProjectToを使用できます > > これは、 `IMapper`インターフェースに`ProjectTo`メソッド( `Map`と同様)が`IMapper`ことを意味します。したがって、まだ`IMapper`する必要があります(ただし、 `Map`を使用していた場合は違いがありません)ので、 `QueryableExtensions`および`ProjectTo` *拡張*メソッドは必要ありません-単純にインターフェイスメソッドを使用します( `Map`と同様): ``` return await _mapper.ProjectTo(dbContext.SomeEntity) .ToListAsync(); ``` `_mapper.ProjectTo`と`Select(_mapper.Map)`には根本的な違いがあることに注意してください-前者はSQLに変換されてサーバー側で実行されますが、後者はクライアントの評価につながり、 `Include` / `ThenInclude` (または遅延読み込み)が必要です適切に機能します。