次のデータ層のセットアップがあります。
public class Repository : IRepository {
private readonly MyDbContext _dbContext;
public List<Meter> Search(Expression<Func<Meter,bool>> criteria)
IQueryable<Meter> results = _dbContext.Meters;
return results.Where(criteria).ToList();
}
}
}
... from a client class:
IRepository _repository;
public void ClientMethod () {
ICollection<int> ids = new List<int>() {1, 2, 3);
var results = _repository.Search(c=> ids.Contains(c.Id)); // This throws exception
}
_
これにより、例外が発生します。
式(source:dbset、述語:(m)=>(unhandledパラメータ:__ids_0)。contains(m.id)) 'を翻訳できませんでした。 QUERTABLE()、asAsynceNumerable()、tolistasync()のいずれかに呼び出しを挿入することで、翻訳できる形式でクエリを書き直すか、またはクライアント評価に切り替えるか、またはクライアント評価に切り替えます。
しかし、IEnumerableまたはListへのコレクション参照を変更した場合、それは機能します。
public void ClientMethod () {
// This works
List<int> ids = new List<int>() {1, 2, 3);
var results = _repository.Search(c=> ids.Contains(c.Id));
// This works
IEnumerable<int> ids = new List<int>() {1, 2, 3);
var results = _repository.Search(c=> ids.Contains(c.Id));
}
_
なぜICollectionのために機能しないのですが、IEnumerable andリストのためにそうですか?私のクライアントメソッドの多くはパラメータとしてICollectionを取ります。
私はEF Core 3.0を使っていますが、私は2.1で同じ問題を抱えていたと思います、それは代わりにクライアント上でそれを評価したときに投げませんでした。
Ienumerable()またはlist()efcoreにキャストすると、クライアントサイドの評価を強制します。 (しかし、性能コストで動作する)