50,000 個の製品 ID のメモリ内にリストリストがあります。これらすべての製品を DB から取得したいと考えています。UsingdbContext.Products.Where(p => list.contains(p.ID))
は SQL で巨大な IN を生成します - WHERE ID IN (2134,1324543,5675,32451,45735...)
、そしてそれは永遠にかかります。これは、SQL Server がこのような大きな文字列を解析するのに時間がかかることと、実行計画が適切でないことが一因です。(代わりに一時テーブルを使用しようとすることでこれを知っています)。
そこで、SQLBulkCopy を使用して ID を一時テーブルに挿入し、実行しました。
dbContext.Set<Product>().SqlQuery("SELECT * FROM Products WHERE ID IN (SELECT ID FROM #tmp))"
これにより、良好なパフォーマンスが得られました。ただし、今は製品とそのサプライヤー (製品ごとに複数) が必要です。カスタム SQL コマンドを使用しても、私が知っている複雑なオブジェクトを取得する方法はありません。では、一時テーブルを使用して、サプライヤーと一緒に製品を取得するにはどうすればよいでしょうか?
(何らかの方法で LINQ で一時テーブルを参照できれば、それで問題ありませんdbContext.Products.Where(p => dbContext.TempTable.Any(t => t.ID==p.ID))
。できるのは . UDF でそれを参照できれば、それも良いことですが、できません。実際のテーブルは使用できません。同時ユーザーが一貫性のない状態のままになるためです。)
ありがとう