2017-02-14 11 views
0

私は、チェックボックスとラジオボタンのサイドバー検索ナビゲーションフィルタを構築しようとしています。私はデータベースから値を取得しています。以下のような、しかし12個のフィルタカテゴリを持つ何かが合計:大きなデータセットを小さなグループに分割する

Color 
    [] red 
    [] green 
    [] blue 
Size 
    [] small 
    [] medium 
    [] large 
Shape 
    [] square 
    [] circle 
    [] triangle 

それは以下のようなコードを使用して私のために働いています。しかし、サブカテゴリーごとにデータベース呼び出しを行うために本当に非効率です:

public ActionResult Index() 
{ 
    SearchBarViewModel model = new SearchBarViewModel(); 
    model.Color = GetValuesFromDb(); 
    model.Size = GetValuesFromDb(); 
    model.Shape = GetValuesFromDb(); 
    return View(model) 
} 

私は、単一のデータベースクエリを作成する大規模なデータセットを返すことによって、これを行うために、より効率的な方法があります推測していることすべてのカテゴリの値を含んでおり、それらをlinqでグループに分割しますか?私はこれがどのように行われるのか分かりません。

データベーススキーマ*

SearchKey   SearchValue 
---------   ----------------- 
Id Name   Id KeyId Value 
---------   ----------------- 
1 Color   1 1  Red 
2 Size   2 1  Green 
3 Shape   3 1  Blue 
        4 2  Small 
        5 2  Medium 
        6 2  Large 

SQLクエリ

SELECT sv.Id, sv.Value 
FROM SearchKey sk 
JOIN SearchValue sv ON sv.KeyId = sk.Id 
WHERE sk.Name = @ValuePassedToSP 
+0

は、GroupBy https://msdn.microsoft.com/en-us/library/system.linq.enumerable.groupby(v=vs.110).aspx を使用できますが、すべての解決方法はテーブルの仕方 –

+0

のように照会しています。 'Color'、' Shape'、 'Size'がすべて同じデータベーステーブルにある場合は、データベースへの呼び出しを1回だけ行うことができます。レコードの種類に基づいてそのリストをフィルタするほしい。 –

+0

'GetValuesFromDb()'メソッドを投稿できますか? –

答えて

1

これは、またはDB呼び出しのパフォーマンスを心配する少し早い開発でないかもしれない可能性があります。メニューの値が頻繁に変化していたり​​、別のコンテキストで変化していない場合は、データベースに格納されているメニュー構造を自分のように保存する方が理にかなっています。メニューの値が頻繁に変更されない場合は、アプリケーションが最初にロードされたときにロードされるプログラムコードまたは設定ファイルに格納する方が良いかもしれません。

私はあなたが既に持っているように「GetALLSearchValuesFromDb()」メソッドが唯一のWHERE句なしで、SQL文によって生成されてIEnumerableを返す場所を探している状況でLINQは、このような何かを行くかもしれないと思う

public ActionResult Index() 
{ 
    SearchBarViewModel model = new SearchBarViewModel(); 
    var searchvalues = GetALLSearchValuesFromDb(); 
    model.Color = searchvalues.Where(sv => sv.Name == "Color"); 
    model.Size = searchvalues.Where(sv => sv.Name == "Size"); 
    model.Shape = searchvalues.Where(sv => sv.Name == "Shape"); 
    return View(model) 
} 
+0

はい、これは私が考えていたソリューションのようですが、私はそれを見たまで視覚化できませんでした。役に立つポストをありがとう! – PixelPaul

関連する問題