Поиск в базе данных в зависимости от выбранных критериев поиска - PullRequest
0 голосов
/ 09 мая 2018

Я слежу за серией YouTube, в которой рассказывается о ASP.NET MVC. В этом уроке учитель показывает, как сделать простую функцию поиска, однако в моем случае это не так.

У меня есть критерии поиска: Исследования (раскрывающийся список), Страна (раскрывающийся список), Статус (раскрывающийся список) и ключевое слово (вход ).

Мой вопрос: как мне запросить базу данных, чтобы показать результаты в зависимости от выбранных критериев поиска?

Для большей ясности : Если пользователь выбрал только Исследования и Страна , тогда для поиска в соответствующем столбце базы данных в коде должны использоваться значения из Исследования и Страны.

Нажмите здесь для дизайна пользовательского интерфейса

Таблица : Студенты

[StudentID]        INT          IDENTITY (1, 1) NOT NULL,
[StudentName]      VARCHAR (50) NOT NULL,
[StudentStudiesID] INT          NOT NULL,
[StudentCountry]   VARCHAR (50) NOT NULL,
[StudentCity]      VARCHAR (50) NOT NULL,
[StudentStatus]    VARCHAR (50) NOT NULL,
CONSTRAINT [PK_Students] PRIMARY KEY CLUSTERED ([StudentID] ASC),
CONSTRAINT [FK_Students_Studies] FOREIGN KEY ([StudentStudiesID]) REFERENCES [dbo].[Studies] ([StudiesID])

SearchController.cs

public class SearchController : Controller
{
    public ActionResult Index()
    {

        DatabaseEntitiesModel db = new DatabaseEntitiesModel();

        int Studies;
        int.TryParse(Request.QueryString["Studies"], out Studies);
        var Country = Request.QueryString["Country"];
        var Status = Request.QueryString["Status"];
        var Keyword = Request.QueryString["Keyword"];

        IQueryable <Student> SearchQuery = db.Students;
        List<SearchViewModel> SVM = SearchQuery.Select(x => new SearchViewModel
        {
            StudentID = x.StudentID,
            StudentName = x.StudentName,
            StudentCountry = x.StudentCountry,
            StudentCity = x.StudentCity,
            StudiesName = x.Study.StudiesName,
            StudentStatus = x.StudentStatus
        }).OrderByDescending(x => x.StudentID).ToList();

        return View( SVM );
    }
}

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Самый простой способ сделать это - проверить каждое условие и, если оно соответствует желаемому, добавить предложение Where. Примерно так:

 int.TryParse(Request.QueryString["Studies"], out Studies);
 var Country = Request.QueryString["Country"];
 var Status = Request.QueryString["Status"];
 var Keyword = Request.QueryString["Keyword"];

 IQueryable<Student> SearchQuery = db.Students;

 if(Studies > 0)
 {
    SearchQuery = SearchQuery.Where(s => s.StudiesID == Studies);
 }
 if(!string.IsNullOrEmpty(Country))
 {
    SearchQuery = SearchQuery.Where(s => s.StudentCountry == Country);
 }
 ...More conditions can go here

Из-за отложенной загрузки фактический запрос не будет выполнен, пока вы не вызовете .ToList () или не выполните итерацию по коллекции. Надеюсь, это поможет вам начать на правильном пути.

Редактировать

В спешке я изменил ваш IQueryable на var. Исправлена. Кроме того, как указал Эрик, использование Request.QueryString не является подходящим способом. Вместо этого вы захотите передать эти значения в метод действия. Итак, что-то вроде:

public ActionResult Index(int studies, string status, string country, string keyword)

0 голосов
/ 10 мая 2018

Повторное использование SearchQuery (элементы загружаются лениво, пока вы не наберете ToList()) и добавьте столько конкретных Where() предложений / вызовов, сколько вам нужно:

// the type (IQueryable<Student>) should be defined explicitly
// details: https://stackoverflow.com/questions/21969154/cannot-implicitly-convert-type-system-linq-iqueryable-to-system-data-entity-d
IQueryable<Student> query = db.Students;

if(viewModel.Filter1 != null) {
    query = query.Where(i => i.SomeStudentProperty1 == viewModel.Filter1);
}

if(viewModel.Filter2 != null) {
    query = query.Where(i => i.SomeStudentProperty2 == viewModel.Filter2);
}

var result = query.ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...