別の答えで。そうでない場合や、SQL Serverを使用していると仮定した場合は、テーブル値のパラメータを使用できます。 Entity FrameworkはContains、特に長いリストでは非常に遅いことに注意してください。
まず、データベース内のカスタム・テーブル・タイプを作成します(何かがうまくいかない場合は、これはテストされたコードが私の頭から右ではないことに注意してください、そう尋ねる)
CREATE TYPE MyType AS TABLE
(
CarName varchar(200) primary key
)
は次に、このようなクエリ:
var listOfPossibleCars = new List<string>();
var dt = new DataTable();
dt.Columns.Add("CarName");
foreach (var car in listOfPossibleCars) {
dt.Rows.Add(car);
}
var possibleCars = new SqlParameter("possibleCars", SqlDbType.Structured);
possibleCars.Value = dt;
possibleCars.TypeName = "dbo.MyType";
var listOfCars = db.Cars.SqlQuery("select C.* from Cars C inner join @possibleCars P on C.CarName = P.CarName", possibleCars).ToList();
はい、生のSQLクエリを使用する必要がありますが、リストが本当に巨大な場合は、Entity Frameworkだけで効率的にクエリを実行することはできません。
出典
2016-11-05 20:05:49
Evk
listOfPossibleCarsは常に同じですか、頻繁に(各呼び出しごとに)変更されていますか? – Evk
@エヴァーク毎回違うよ、いつも大きいよ – SB2055
車のテーブル全体の大きさはどれくらいですか?それを記憶に持っていくことは実現可能でしょうか?それ以外の場合は、SqlBulkIncertを使用してtempテーブルを作成し、@Evikのような結合を行うことをお勧めしますが、2つのテーブル、1つのクエリIDを持つことをお勧めします。 FilterID、varchar値)。したがって、各フィルタをロックする必要がなく、同時に誰もそれを更新しようとしないようにすることができます –