#sql #dynamic #asp.net-mvc
#sql #динамический #asp.net-mvc
Вопрос:
Кажется, я просто не могу осознать эту концепцию… Я хочу разрешить пользователям применять ряд «фильтров» к набору данных (предпочтительно в строке запроса, чтобы разрешить добавление в закладки отфильтрованных результатов), полученных с помощью «инструмента» массового динамического доступа к данным»Роба Конери.
Я мог бы просто написать целую кучу if, а затем написать прямой запрос по каждому «правилу», которое я улавливаю… но это, похоже, противоречит цели «dynamic sql».
Существует ли общий шаблон / лучшая практика для этого в C # / ASP.NET MVC?
Ответ №1:
Я думаю, концепция немного широкая, чтобы говорить, что есть шаблон / лучшая практика для выполнения чего-то подобного. Тем не менее, я думаю, что использование чего-то вроде LINQ to SQL или Entity Framework сделало бы хороший механизм динамических запросов, потому что вы можете делать подобные вещи:
var query = DBContext.Items.Select(x => x.Name);
switch(QueryString["Type"])
{
case "Dog":
query = query.Where(x => x.Type == "Dog";
break;
case "Cat":
query = query.Where(x => x.Type == "Cat";
etc....
}
query = query.Where(x => x.Owner.Name == QueryString["Owner"]);
ResultsDataGrid.Datasource = query;
Очевидно, что там есть какой-то псевдокод, но хорошая вещь в LINQ to SQL в этом случае — отложенное выполнение. query
не запускается до привязки к данным и включает любые фильтры, которые вы добавляете динамически. Это также обеспечивает безопасность типов и предотвращает внедрение SQL. Вы можете сделать что-то подобное, фактически создав SQL-запрос, который будет выполняться в конце, но это будет подвержено ошибкам и потребует множества проверок и противовесов.
Комментарии:
1. Спасибо … как насчет случаев, когда я хочу динамически применять более 1 фильтра?
2. Приведенный выше пример делает именно это. Запрос начинается с выбора всех элементов. Затем, в зависимости от переменной querystring «Type», она будет фильтровать исходные элементы. Затем, на основе переменной querystring «Owner», она будет фильтровать дальше. На самом деле запрос выполняется не каждый раз при добавлении фильтра, а только тогда, когда это необходимо в конце. Вы также можете добавить условные фильтры, такие как:
if(needed){//addExtraQueryHere;}
lines.3. А, я видел это
break;
в вашемswitch
. Сейчас я отслеживаю. Спасибо!