Настраиваемая сортировка и фильтрация MVC 3 LINQ с указанными пользователем полями (свойства) - PullRequest
1 голос
/ 24 февраля 2012

Я пишу пользовательское веб-приложение (административная утилита), которое запрашивает таблицу базы данных SQL Server, и я даю пользователям возможность применять свои (ограниченные) пользовательские сортировки и фильтры к возвращаемой информации.На странице отправки можно выбрать до 3 критериев сортировки (например, Сортировка 1, Сортировка 2, Сортировка 3), используя раскрывающиеся списки в форме HTML.Они также должны указывать одну букву алфавита (через URL), и приложение должно возвращать список данных, где поле «Сортировка 1» начинается с буквы (фильтрация ВСЕГДА по полю Сортировка 1).

Так, например, они могли бы выбрать возврат списка всех клиентов, чей Город начинается с буквы «R», отсортированный по Городу, затем Штату, а затем Имени.Или они могут вернуть всех клиентов, чье имя начинается с «F», отсортировано по имени, затем по адресу, а затем по идентификатору клиента.

Я полностью понимаю, как это сделать с фиксированными (известными) полями / свойствами;

var _data = _data.Where(d => d.Name.StartsWith(letter)).OrderBy(p => p.Name).ThenBy(p => p.Address).ThenBy(p => p.CustomerID);

и т. Д.Но в моем случае свойства таблицы (поля) для сортировки / фильтрации не известны в явном виде;они доступны только для моего приложения в виде строк.То, что я хотел бы сделать, это ...

var _data = _data.Where(d => d.["Sort1"].StartsWith(letter)).OrderBy(p => p.["Sort1"]).ThenBy(p => p.["Sort2"]).ThenBy(p => p.["Sort3"]);

где Sort1, Sort2 и Sort3 публикуют значения полей формы, но я знаю, что это не работает.Как я могу это реализовать?Я использую ASP.Net MVC 3 в C #, а LINQ использует Entity Framework (EDM).

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

Как насчет этого подхода:

Func<Record, object> sort1 = r => GetProperty(r, "City");
Func<Record, object> sort2 = r => GetProperty(r, "State");
Func<Record, object> sort3 = r => GetProperty(r, "Address");

Func<Record, bool> filterPredicate = p => GetProperty(p, "City").ToString().StartsWith("A");

IEnumerable<Record> enumerable = list.Where(filterPredicate)
                                     .OrderBy(sort1)
                                     .ThenBy(sort2).
                                     .ThenBy(sort3);

Где GetProperty реализовано как:

static object GetProperty(Record record, string paramName)
{
    if (paramName == "City") return record.City;
    if (paramName == "State") return record.State;
    if (paramName == "Address") return record.Address;
    if (paramName == "CustomerId") return record.CustomerId;
    throw new InvalidEnumArgumentException();
}
0 голосов
/ 24 февраля 2012

Вы должны сделать свой запрос динамическим, а когда делаете динамический запрос, вы должны использовать команду (Exec) на SQL для выполнения вашего динамического запроса.

Вот так: D

Но вы должны заметитьэта команда execute не так хороша для проблем с производительностью.

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