Лучший подход для предварительного поиска в ASP.Net MVC 3.0?

#c# #forms #search #logic

#c# #формы #Поиск #Логические

Вопрос:

Я работаю над ASP.net Приложение MVC 3.0 Razor View Engine.
У меня есть форма предварительного поиска, чтобы получить список найденных клиентов
В котором будут такие поля, как

  • Текстовое поле FirstName
  • Текстовое поле LastName
  • Текстовое поле DOB
  • Текстовое поле адреса
  • Выпадающий список пола
  • Текстовое поле почтового индекса
  • Игнорировать флажок Адрес
  • Наконец, кнопка отправки.
    У меня есть список клиентов в объекте списка.
    Ни одно поле не является обязательным в форме поиска.
    Когда пользователь нажимает поиск на основе значений, которые он указал в форме, моя логика должна возвращать соответствующие результаты из объекта List, в котором хранятся все данные клиента.

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

    Я начал с чего-то вроде этого

     if (fname != "" amp;amp; lname == "")
            {
                return _CustomerList.FindAll(p => p.FirstName == fname);
            }
            else if (fname == "" amp;amp; lname != "")
            {
                return _CustomerList.FindAll(p => p.LastName == lname);
            }
    
            else if (fname != "" amp;amp; lname != "")
            {
                return _CustomerList.FindAll(p => p.FirstName == fname amp;amp; p.LastName == lname);
            }
    return _CustomerList;
      

    Я не думаю, что это эффективный способ.

    Любые советы были бы большой помощью. спасибо за чтение. 🙂

    Комментарии:

    1. это тааак старомодно. Разве у вас не может быть только одного текстового поля для ввода, как у chrome? быстрый поиск является современным и используется повсеместно в настоящее время, chrome, меню «Пуск» Win7, IE9, последняя версия black berry… вы выполняете интеллектуальный расширенный поиск в фоновом режиме, но просите пользователя ввести значение поиска только в одном поле. Если Google может выполнять поиск по всему Интернету, вы должны иметь возможность выполнять поиск в своей базе данных.

    2. @DavidePiras «вы должны иметь возможность выполнять поиск в своей базе данных», я хотел бы получить комментарии DV. Подобные комментарии показывают очень серьезные недостатки в понимании. База данных, в которой Google выполняет анализ текста, сильно отличается от любой стандартной транзакционной базы данных. Хорошо выполненный полнотекстовый поиск — неизменно сложная задача.

    3. это не то, что я имел в виду, не хотел сравнивать Google BigTable или GFS и индексирование с вашими. В любом случае, решайте сами. Мы используем поиск в одном окне в нескольких проектах, и пользователи сначала теряются, а затем изучают его, и им это нравится. вы можете выполнять поиск по FT или по классическому предложению compare / where в выбранном списке полей. В результате пользовательский интерфейс становится плавным и высоко ценится.

    Ответ №1:

    Вместо этого используйте Linq и an IEnumerable<Customer> — вы можете составить свой запрос с дополнительными Where() предложениями по мере необходимости и в конце вернуть соответствующие элементы в виде списка, используя ToList() .

     var matchingCustomers = _CustomerList;
    
    if (!string.IsNullOrEmpty(lname))
    {
        matchingCustomers = matchingCustomers.Where(x => x.LastName == lname);
    }
    
    if (!string.IsNullOrEmpty(fname))
    {
        matchingCustomers = matchingCustomers.Where(x => x.FirstName == fname);
    }
    
    //...
    
    return matchingCustomers.ToList();
      

    Комментарии:

    1. Я думаю, это сработает для меня. Я опубликую ответ, как только полностью его реализую

    Ответ №2:

    Я думаю, это вам поможет..

     if (!string.IsNullOrEmpty(lname) || ! string.IsNullOrEmpty(fname))
    
    {
    
    _CustomerList= _CustomerList.Where(x =>x.LastName.Contains(lname.ToUpper().Trim()) ||               
     x.FirstName.Contains(fname.ToUpper().Trim())
    );
    
    return _CustomerList.ToList();
    
    }