Web アプリケーション (C# の ASP.NET 4.0) があり、疑似 Adhoc コンポーネントを作成しています。このコンポーネントを使用すると、ユーザーは事前に定義されたカテゴリ (カー メーカー、ケア モデル、カー アクセサリーなど) のリストから選択できます。ユーザーは、必要な数のカテゴリを選択できます。[フィルタ] ボタンをクリックすると、選択したカテゴリが取得され、各カテゴリのオプションを含む新しいフォームに送信されます。各カテゴリには複数のオプションを含めることができます。
例: ユーザーが車の色、車のアクセサリーを選択します。
フィルター ページには、車の色の色が事前入力されたドロップダウンを含むフォームが表示されます。フォームには、サテライト ラジオ用のチェック ボックス、レザー インテリア用の別のチェック ボックスなどが表示されます。これらの値はすべて事前定義されています。ユーザーがフィルター処理できるすべてのアイテムを指定したら、Linq を使用してデータベースにクエリを実行します。現状では、Linq クエリは、現在 14 の左外部結合を保持するビューに対するものであり、まったくフィルター処理されていない場合、30,000 を超える行が返されます。
私は動的linqを使用してデータベースリンクにクエリを実行しています:
var data = CMS.Model.Adhoc.GetData().AsQueryable(); //must be AsQueryablefor Dynamic Linq to function
public static List<ViewADHOCContractInfo> GetData()
{
PortalDataContext db = new PortalDataContext(AuthenticatedUser.ConnectionString);
return db.ViewADHOCInfos.Select(x=>x).Distinct().ToList();
}
GetData() は結果セットのすべての行とすべての列を返していることに注意してください。これは、これを行う最も効率的な方法ではないと思います。詳細については、下部で説明します。
そこから、送信されたフィルターで FOREACH ステートメントを実行し、各反復で結果セットを次のように最小化します (省略):
foreach (Filters filter in filters.OrderBy(x=>x.strOrderNumber))
{
SanatizeFilter(filter.strFilter,filter);
if (filter.strValue != string.Empty && filter.strValue != null)
{
if (filter.strOperator == "Contains")
{
data = data.Where(filter.strFilter + "!= NULL and " + filter.strFilter + ".Contains(@0)", filter.strValue).
Select(x => x).ToList().AsQueryable();
}
else
{
data = data.Where(filter.strFilter + FormatOperator(filter.strOperator) + "@0", filter.strValue).
Select(x => x).ToList().AsQueryable();
}
}
}
これはすべて正常に動作しますが、遅いです。私の最初の質問は、Linq を使用してこれを少し削減するにはどうすればよいかということです。事前入力の方法として、フィルターからのデータのみを変数「データ」にプルする方法をいくつか試しましたが、.AsQueryable() で動作させることはできません。すべてのオーバーヘッドに対処する必要がないように、フィルター オブジェクトから列識別子を取得し、データベースからそれらのみを選択できるようにしたいと考えていますが、それを可能にするソリューションが見つかりません。これを行う、何かアイデアはありますか?
2 番目の質問は、現在、これはすべてデータベースのビューにあります。関数またはストアド プロシージャに移動する方が高速/効率的でしょうか? Linq はストアド プロシージャと対話できますか?
前もって感謝します