Реализация фильтров для отображения таблицы SQL в представлении в ASP.NET MVC (C #) и LINQ-to-SQL? - PullRequest
0 голосов
/ 29 января 2009

В ответ на этот вопрос , я изменил свой контроллер и маршрутизацию так, что теперь значение сортировки назначается с помощью? Sort =, однако я также хочу реализовать возможность фильтрации для пользователей таблица основана на выбранном наборе значений:

Техник: Tech1, Tech2, Tech3 и т. Д. Категория: Категория1, Категория2, Категория3 и т. Д. Приоритет: Приоритет1, Приоритет2, Приоритет3 и т. Д.

В настоящее время я использую только одну таблицу, поэтому самый простой способ получить список доступных категорий для фильтрации - это выбрать отдельные значения категории из таблицы. Все они вводятся через HTML, так что я могу контролировать то, что вставляется. Я пока не хочу разбивать их все на разные таблицы, сейчас я пытаюсь сделать как можно больше с одной таблицей, но если это сценарий, который нарушает модель с одной таблицей, тогда я могу его корректировать.

Для пояснения варианта использования, вероятно, лучше всего показать быстрый снимок экрана рассматриваемого представления:

http://images.robburke.ie/stackoverflow/491563.png
Нажмите для просмотра в полном размере.

Я хочу внедрить систему, в которой пользователь мог бы, например, фильтровать «Приоритет», чтобы показывать только проблемы, в которых приоритет был «Следственный».

Я ищу предложения о том, как реализовать это как на передней, так и на задней части. Я пытался найти сайт, который делает что-то похожее с таблицами данных, но я не могу вспомнить ни одного из них, хотя я уверен, что эта функция была реализована сто раз раньше!

Кто-нибудь может порекомендовать хороший способ сделать это?

Ответы [ 2 ]

1 голос
/ 29 января 2009

Уровень сервера

Давайте начнем с некоторого псевдокода.

public ActionResult Open(string sort, string technician, 
    string category, string priority)
{
    // generate query
    // filter stuff
    // order/sort stuff
}

Здесь важно правильно определить порядок операций. Некоторые провайдеры IQueryable ( Я смотрю на вас, Entity Framework ) будут молчаливо игнорировать порядок, если он наступит до фильтрации. Поэтому начните с создания неупорядоченного нефильтрованного запроса, как и в случае с последним вопросом, затем добавьте фильтрацию и, наконец, добавьте порядок.

Обратите внимание, что я добавил аргумент к вашему действию для каждого возможного случая фильтра. Это один из способов сделать это. Другой способ сделать это - разрешить фильтрацию практически всего, перебирая параметры строки запроса (внутри запроса), рассматривая все, что не называется «сортировка», как потенциальный фильтр. Вы должны выбрать, что лучше всего подходит для вашего приложения.

Теперь, как вы на самом деле реализуете фильтрацию? То, что показал Марк, это один из способов. Это работает очень хорошо, если есть только определенные случаи, которые вы собираетесь фильтровать. Очевидно, я бы поместил его в вспомогательный метод, а не в само действие. Скорее всего, вам нужно повторно использовать этот помощник и другие действия. Однако, если вы намереваетесь предложить фильтрацию по большему количеству строк, чем вы хотите описать в одном методе, другим способом будет использование библиотеки Microsoft Dynamic LINQ, которую можно получить из CodePlex. Это позволяет вам создавать LINQ. Где используются строки вместо лямбда-выражений.

Уровень браузера

Теперь, когда ваше приложение может справиться с этим, вам нужен метод создания ссылки, которая выглядит следующим образом:

http://example.com/Issue/Open?sort=ID&priority=Investigative

Если у вас есть меню параметров фильтра, например, каждый пункт меню будет соответствовать ссылке с различными параметрами строки запроса.

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

Итак, общий подход, который мы используем при этом, для каждого элемента в «меню фильтрации» (или любой другой ссылки на ваше здание):

  1. Создание RouteValueDictionary параметров строки запроса
  2. Добавление всех параметров строки запроса, переданных в текущее представление, в словарь.
  3. Добавить дополнительный параметр строки запроса для текущего элемента меню.
  4. Создайте окончательный URL-адрес, используя Html.RouteLink и созданный нами словарь.
0 голосов
/ 29 января 2009

Я не совсем понимаю сценарий использования, но вы можете легко добавить фильтры с помощью IQueryable<T>:

var query = /* your primary query */

if(!string.IsNullOrEmpty(name)) {
    query = query.Where(row => row.Name == name);
}

if(activeOnly) {
    query = query.Where(row => row.IsActive);
}

и т.д.

Вы можете сделать более сложные вещи, создав Expression вручную, но вышеописанное имеет то преимущество, что его легко отлаживать и проверять компилятором (компилятор обеспечит наличие подходящего свойства IsActive и т. Д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...