2012-05-11 2 views
2

У меня есть страница, на которой пользователю предлагаются четыре . Я предполагаю взять пересечение полей и показать результаты. Однако пользователю не требуется заполнять все поля.Поиск в MVC application

В моем контроллере у меня есть следующий код.

string subject = (string)Session[d.sessionSearchSubject]; 
string courseNumber = (string)Session[d.sessionSearchCourseNum]; 
string yearLev = (string)Session[d.sessionSearchYearLev]; 
string period = (string)Session[d.sessionSearchPer]; 


if (!(subject.Equals("") && courseNumber.Equals("") && yearLev.Equals("") && period.Equals(""))) 
{ 
    db.Courses.Where(a => a.subject.Equals(subject) && a.coursenumber.Equals(courseNumber) && a.period.Equals(period... 
} 
else if (!(subject.Equals("") && courseNumber.Equals("") && yearLev.Equals(""))) 
{ 
    // Query the database. 
} 
else if (!(subject.Equals("") && courseNumber.Equals("") && period.Equals(""))) 
{ 
    // Query the database. 
} 
else if (!(subject.Equals("") && yearLev.Equals("") && period.Equals(""))) 
... 

Как вы можете видеть, будет много утверждений if. Мне было интересно, есть ли лучший способ сделать это? т.е. один запрос, который игнорирует поле, если оно пустое. Или, если я могу заменить пустую строку чем-то, что было бы эквивалентно «любому» ???

ответ

2

Вы могли бы сломать результаты в четыре утверждения, соответствующие каждому из четырех критериев:

var results = db.Courses; 
if(!string.IsNullOrEmpty(subject)) 
    results = results.Where(c => c...); 
if(!string.IsNullOrEmpty(courseNumber)) 
    results = results.Where(c => c...); 
...etc... 

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

1

Почему у вас есть вся эта логика в контроллере?

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

Образец, который у вас есть в настоящее время - это тонкая модель с плотным регулятором, если у вас должна быть Тонкая контрольная модель жира (вся логика выполняется в модели, и контроллер направляет вас к правильному виду).

Совет:

Вместо того, чтобы делать !subject.Equals("") вы могли бы использовать string.IsNullOrEmpty(subject)

+0

+1 для тонкого контроллера Fat Model :) – mattytommo

2

Разве вы не можете просто поставить эту логику в одном операторе LINQ? Что-то вроде:

var results = db.Courses 
    .Where(c => (c.subject == subject && c.subject != "") 
     || (c.coursenumber == courseNumber && c.coursenumber != "") 
     || (c.yearLev == yearLev && c.yearLev != "") 
     || (c.period == period && c.period != "")) 
    .ToList(); 
+0

хорошее предложение :-) +1 –