Как я могу найти, сколько условий я бы ожидал от окна поиска с параметрами фильтрации - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь реализовать окно поиска с несколькими опциями фильтрации. Я бы хотел посчитать, сколько возможных условий у меня будет. например, у меня есть два поля поиска с вариантами поиска по названию или по местоположению или по обоим, а также у меня есть два варианта отображения результатов на основе последних 24 часов опубликованных результатов или в течение 3 дней. Например, некоторые из условий могут заключаться в том, что место поиска пустое, а остальные нет, а другим примером может быть то, что опция 24 часа включена, а остальные нет. попытка решения этой проблемы приведена ниже, но я ищу точный способ подсчета всех этих условий и того, как я могу структурировать их в рамках простого кода.

    [HttpGet]
    public ActionResult SearchResult(int? page, string searchTitle = "" , string searchLocation = "", string last24="", string last3Days= "")
    {      
        setUpApi(searchTitle, searchLocation);
        var result = new List<AllJobModel>();
        DateTime now = DateTime.Now;
        var time = now.AddHours(-24).ToString("dd/MM/yyyy").ToString();
        var time2 = now.AddHours(-48).ToString("dd/MM/yyyy").ToString();
        var time3 = now.AddHours(-72).ToString("dd/MM/yyyy").ToString();
        var timesNow = now.ToString("dd/MM/yyyy").ToString();
        if ((!string.IsNullOrEmpty(searchTitle) || !string.IsNullOrEmpty(searchLocation)) && (!string.IsNullOrEmpty(last24) || !string.IsNullOrEmpty(last3Days)))
        {
            setUpApi(searchTitle, searchLocation);

            if (!string.IsNullOrEmpty(last24))
            {
                result = db.AllJobModel.Where(a => a.JobTitle.Contains(searchTitle) && a.locationName.Contains(searchLocation) && a.PostedDate == timesNow ||
                a.PostedDate.Equals(time)).ToList();
            }
            else if (!string.IsNullOrEmpty(last3Days))
            {
                result = db.AllJobModel.Where(a => a.JobTitle.Contains(searchTitle) && a.locationName.Contains(searchLocation) && a.PostedDate == timesNow ||
               a.PostedDate.Equals(time3) || a.PostedDate == time2 || a.PostedDate == time).ToList();
            }
        }
        else if(!string.IsNullOrEmpty(searchTitle) || !string.IsNullOrEmpty(searchLocation) && (string.IsNullOrEmpty(last24) || string.IsNullOrEmpty(last3Days)))
        {
            result = db.AllJobModel.Where(a => a.JobTitle.Contains(searchTitle) && a.locationName.Contains(searchLocation)).ToList();
        }
        else if ((string.IsNullOrEmpty(searchTitle) || string.IsNullOrEmpty(searchLocation)) && (!string.IsNullOrEmpty(last24) || !string.IsNullOrEmpty(last3Days)))
        {
            if(!string.IsNullOrEmpty(last24))
            {
                result = db.AllJobModel.Where(a => a.PostedDate.Equals(time)).ToList();
            }else if(!string.IsNullOrEmpty(last3Days))
            {
                result = db.AllJobModel.Where(a => a.PostedDate == timesNow ||
              a.PostedDate.Equals(time3) || a.PostedDate == time2 || a.PostedDate == time).ToList();
            }      
        }
        else
        {
            result = (from app in db.AllJobModel select app).ToList();
        }


        return View(result.ToList().ToPagedList(page ?? 1, 5));
    }

1 Ответ

1 голос
/ 28 марта 2020

Вы можете рассчитать количество перестановок, умножив различные параметры для каждого фильтра. В вашем случае это дает вам 2 * 2 * 3 = 12 перестановок (два варианта для searchTitle, два для searchLocation, три для фильтров времени).

Что касается работы с этими перестановками, если Эффект фильтра должен быть одинаковым независимо от других активных фильтров, вы можете воспользоваться тем, что вы можете фильтровать перечисляемый объект в нескольких отдельных вызовах Where, каждый из которых применяет дополнительную фильтрацию к набору результатов.

Учитывая мою интерпретацию намерения вашего кода, я придумал следующее:

[HttpGet]
public ActionResult SearchResult(
    int? page,
    string searchTitle = "",
    string searchLocation = "",
    string last24 = "",
    string last3Days = "")
{
    setUpApi(searchTitle, searchLocation);

    var result = db.AllJobModel;

    // Search filters
    if (!string.IsNullOrEmpty(searchTitle))
    {
        result = result.Where(a => a.JobTitle.Contains(searchTitle));
    }
    if (!string.IsNullOrEmpty(searchLocation))
    {
        result = result.Where(a => a.locationName.Contains(searchLocation));
    }

    // Time filters
    var hasTimeFilter = !(string.IsNullOrEmpty(last24) && string.IsNullOrEmpty(last3Days));
    if (hasTimeFilter)
    {
        var numberOfAdditionalDays = string.IsNullOrEmpty(last24) ? 3 : 1;
        var totalValidDays = 1 + numberOfAdditionalDays;

        var now = DateTime.Now;
        var validDays = Enumerable.Range(0, totalValidDays).
            Select(i => now.AddDays(-1 * i).ToString("dd/MM/yyyy")).
            ToList();

        result = result.Where(a => validDays.Contains(a.PostedDate));
    }

    return View(result.ToList().ToPagedList(page ?? 1, 5));
}

Выше может быть не совсем то, что вам нужно, так как я изменил некоторые логические логики c на то, что я думаю вы пытались сделать, и пропустили повторный вызов setUpApi(searchTitle, searchLocation), но его должно быть достаточно легко изменить в соответствии с вашими требованиями.

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