質問: tags.Where(t => tagIds.Contains(t.TagId)); return tags .ToList() // explicit client evaluation in 3.0 .ToDictionary(t => t.TagId, t => t); } ``` これは、次のようなSQLステートメントを生成するために使用されました。 ``` SELECT TagId, Name FROM Tag WHERE TagId IN (1, 2, 3) ``` これは、正しくインデックスが付けられた列と少数の`IN`値に対して非常にうまく機能しました。 現在、 `List<>.Contains` translationはサポートされていないことを示す次のエラーが表示さ`List<>.Contains` > System.InvalidOperationException: 'LINQ式' Where(source:DbSet、predicate:(t)=>(Unhandled parameter:__tagIds_0).Contains(t.TagId)) 'は翻訳できませんでした。変換可能な形式でクエリを書き換えるか、AsEnumerable()、AsAsyncEnumerable()、ToList()、またはToListAsync()のいずれかに呼び出しを挿入して、クライアント評価に明示的に切り替えます。詳細については、クライアントとサーバーの評価-EFコアを参照してください。 > > これは、 LINQクエリがクライアントの重大な変更で評価されなくなったことを示して`Contains`が、AFAIK `Contains`はクライアントで評価されていません。
回答: これは3.0のバグで、 #17342によって追跡されています。汎用のIList / HashSet / ImmutableHashSetに含まれると、例外がスローされます 。 3.1ですでに修正されています。回避策(待てない場合)は、たとえば`Enumerable.Contains`の使用を強制することです。 ``` t => tagIds.AsEnumerable().Contains(t.TagId) ``` または変数の型を変更します。