2017-02-14 66 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

它可能會或可能不會是一個小開發的早期階段需關注分貝的呼叫性能。如果菜單值不會經常或在不同的上下文中更改,那麼將菜單結構存儲在數據庫中會更有意義,就像您一樣。如果菜單值不經常更改,最好將它們存儲在程序代碼或設置文件中,該文件僅在您的應用程序第一次加載時加載,或者在此之後有需求時加載。

我想在上下文中的LINQ您正在尋找可能會去這樣的事情,這裏的「GetALLSearchValuesFromDb()」方法,就像你已經,只是沒了WHERE子句返回由SQL語句生成一個IEnumerable:

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

相關問題