フロントエンドのUIには、バックエンドで数百万行以上のフィルタリングシステムがあります。これは、ロジックの過程で構築されたIQueryableを使用し、一度にすべて実行されます。それぞれの個々のUIコンポーネントはANDで結ばれます(たとえば、Dropdown1とDropdown2は共通に選択されているものの両方を持つ行のみを返します)。これは問題ではありません。ただし、Dropdown3には2つのタイプのデータがあり、チェックされたアイテムは一緒にORされ、残りのクエリとANDされる必要があります。Linqクエリのタイムアウト、どのように合理化クエリ
大量の行が処理されているため、タイムアウトが発生します。起こる必要があるいくつかの追加の結合があるので、ややこしい。ここに私のコードは、テーブル名を交換して、次のとおりです。
//The end list has driver ids in it--but the data comes from two different places. Build a list of all the driver ids.
driverIds = db.CarDriversManyToManyTable.Where(
cd =>
filter.CarIds.Contains(cd.CarId) && //get driver IDs for each car ID listed in filter object
).Select(cd => cd.DriverId).Distinct().ToList();
driverIds = driverIds.Concat(
db.DriverShopManyToManyTable.Where(ds => filter.ShopIds.Contains(ds.ShopId)) //Get driver IDs for each Shop listed in filter object
.Select(ds => ds.DriverId)
.Distinct()).Distinct().ToList();
//Now we have a list solely of driver IDs
//The query operates over the Driver table. The query is built up like this for each item in the UI. Changing from Linq is not an option.
query = query.Where(d => driverIds.Contains(d.Id));
どのように私は私がメモリにIDの数千人と数千人を取得する必要がないように、その後、このクエリを合理SQLにそれらをフィードバックすることができますか?