Поиск и фильтрация условных множественных полей в LINQ - PullRequest
5 голосов
/ 17 июня 2009

Предполагая, что у нас есть следующая таблица:

Person:
  PersonID,
  Name,
  Age,
  Gender

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

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

Логика для этого может быть записана следующим образом:

var p;
if(Name_TextBox=='')
{
   p=from row in person
        select row ;
}
else 
{
  p= from row in person
      where row.Name=Name_TextBox
        select row ;
}
// repeat the same for age

Теперь через некоторое время код становится очень длинным и запутанным ... Как я могу сжать вышеприведенный запрос в один запрос с no if-else ?

Ответы [ 3 ]

9 голосов
/ 17 июня 2009

Попробуйте код, подобный этому

       string personName = txtPersonName.Text;
       int personAge = Convert.ToInt32(txtAge.Text);
       var opportunites =  from p in this.DataContext.Persons
                            select new
                            {
                                p.PersonID,
                                p.Name,
                                p.Age,
                                p.Gender
                            };

        if (personsID != 0)
            opportunites = opportunites.Where(p => p.PersonID == personID);

        if (personName != string.Empty)
            opportunites = opportunites.Where(p => p.Name.StartsWith(personName));

        if (personAge != 0)
            opportunites = opportunites.Where(p => p.Age == personAge);

Это будет хорошо работать. Если personName не указано, оно не будет добавлено к месту, а если указано, будет добавлено.

5 голосов
/ 17 июня 2009

Одна альтернатива, которую я использовал в SQL, которая также может быть реализована в Linq, это

var p = from p in Person
       where p.Name == Name_TextBox || Name_TextBox == String.Empty
       select p;

(Обратите внимание, что ваш 'linq' использует синтаксис SQL, который не компилируется. Также вы не можете объявить переменную, как вы делаете, без непосредственного присвоения значения)

2 голосов
/ 18 апреля 2013

почему бы не использовать оператор объединения нулей? например.

var products = from a in context.products where a.ID == (productID ?? a.ID) select a;

Это действительно хорошо работает в моей системе

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