Фильтрация событий - SQL - PullRequest
0 голосов
/ 22 февраля 2012

В настоящее время у меня есть:

public static IList getFilteredEvents(  DateTime Start, DateTime End, string env, string req) {
    string QueryString;
    if( env == "all" ) {
        QueryString = "SELECT * FROM table WHERE date BETWEEN '" + Start + "' AND '" + END + "'";
    } else {
        QueryString = "SELECT * FROM table WHERE date BETWEEN '" + Start + "' AND '" + END + "' AND env='" + env + "'";
    }
}

Я получаю строку запроса, передавая объект данных из представления. В моем контроллере я получаю это так: string env = Request.QueryString["filter"];

Есть ли лучший способ отфильтровать мои результаты вместо того, чтобы писать несколько запросов в цепочке if-elseif? Как бы я достиг этого для нескольких фильтров, например в запросе AND req = '" + req + "';?

Спасибо за вашу помощь!

Ответы [ 2 ]

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

Вы действительно открываете себя для внедрения SQL согласно комментарию. Надеюсь, вы измените это на параметризованный процесс / сделаете некоторую проверку используемых значений.

В SQL вы можете сделать:

AND (@env = 'all' OR env = @env)  

Если вы настаиваете на использовании динамического SQL:

string envWhere = (env == "all") ? "" : " AND env = '" + env + "'";

Затем объедините это с основной строкой SQL

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

Вы можете добавить AND s в if-else. Например,

 QueryString = "SELECT * FROM table WHERE date BETWEEN '" + Start + "' AND '" + END + "'";
 if ( env == "all")
 {        
    QueryString  += " AND (env IS NULL OR env=env)"; 
    //if env cannot be null, than you just need  " AND env=env"
 }
 else
 {
     QueryString += "' AND (env='" + env + "')";
 }

И лучше использовать StringBuilder для построения динамической строки;

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