какой запрос LINQ вернет результаты, основанные на частичном сопоставлении с произвольным числом полей объекта? - PullRequest
1 голос
/ 02 марта 2010

рассмотрим следующий код, который представляет собой попытку реализовать частичное сопоставление. ожидаемый результат - строка для любых 1 или более полей, которые соответствуют объекту запроса и хранилищу данных.

поэтому, если вы предоставляете person.email, мы хотим сопоставить это, если вы предоставляете person.email и person.FirstName, мы должны отфильтровать результаты дальше и т. Д.

        var results = from p in db.Persons
                      where p.CrookBookUserName.Trim().Contains(person.CrookBookUserName.Trim()) ||
                      p.email.Trim().Contains(person.email.Trim()) ||
                      p.FirstName.Trim().Contains(person.FirstName.Trim()) ||
                      p.LastName.Trim().Contains(person.LastName.Trim()) ||
                      p.phone.Trim().Contains(person.phone.Trim())
                      select p;

        return results;

к сожалению, этот код всегда возвращает все строки в БД. почему и что должно быть исправлено?

спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 02 марта 2010

Вам необходимо проверить, предоставляет ли пользователь пустые строки.

var query = db.Persons;
if (!string.IsNullOrEmpty(person.CrookBookUserName.Trim()) {
    query = query.Where(p => p.CrookBookUserName.Trim().Contains(person.CrookBookUserName.Trim()));
}
if (!string.IsNullOrEmpty(person.email.Trim()) {
    query = query.Where(p => p.email.Trim().Contains(person.email.Trim()));
}
// etc...

return query;
0 голосов
/ 02 марта 2010

Все ли поля заполнены? p.email.Trim().Contains("") с пустого адреса электронной почты вернет true для всего.

Дополнительная (!String.IsNullOrEmpty(..)) && перед каждым параметром, хотя и многословная, исправит его, если это проблема.

Редактировать комментариев:

Да, здесь может помочь вспомогательный метод или что-то в этом роде ... что-то вроде

public static bool ContainsIfNotEmptyTrimmed(this string source, string param)
{
    return !String.IsNullOrEmpty(param.Trim()) && source.Trim().Contains(param.Trim());
}

where p.CrookBookUserName.ContainsIfNotEmptyTrimmed(person.CrookBookUserName) || ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...