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

Если 'Цвет',' Форма' и 'Размер' находятся в одной таблице базы данных .. тогда вы могли бы просто сделать 1 вызов в базе данных .. сохранить все записи в список .. тогда просто фильтровать этот список в зависимости от типа записей yo ты хочешь. –

+0

Можете ли вы опубликовать метод GetValuesFromDb()? –

ответ

1

Это может или не может быть немного раньше в вашем развитии, чтобы беспокоиться о производительности БД звонков. Если значения меню не изменяются часто или в разных контекстах, имеет смысл иметь структуру меню, хранящуюся в базе данных, как вы. Если значения меню не часто меняются, лучше хранить их в программном коде или файле настроек, который загружается только при первом загрузке приложения или, возможно, после этого.

Я думаю, что LINQ в контексте вы ищете может пойти что-то вроде этого, где «GetALLSearchValuesFromDb()» метод возвращает IEnumerable порождена SQL заявление, как вы уже, только без предложения WHERE:

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

 Смежные вопросы

  • Нет связанных вопросов^_^