проблема лямбда-выражения - PullRequest
0 голосов
/ 27 февраля 2012

Я новичок в лямбда-выражениях, и у меня возникают проблемы при попытке выяснить, как представить мой запрос структуры сущностей в одном. Я тоже могу ошибаться, и есть просто лучший способ сделать то, что я хочу. Если это правда, пожалуйста, дайте мне знать. По моему сценарию у меня есть экран расширенного поиска, где вы можете выбрать поиск по имени, номеру клиента или номеру телефона. Вы можете искать более чем на 1, если хотите. Я использую Entity Framework в качестве моего бэкэнда, и для моих таблиц настроены репозитории. Ниже приведен код, который я пытаюсь использовать

Func<Parties, bool> exp;

exp = null;

if (vm.CustomerNumberCriteria != null)
{
    custID = Convert.ToInt32(vm.CustomerNumberCriteria);
    exp = o => o.ID == custID;
}


if (vm.NameCriteria != null)

    exp += o => o.LastName.Contains(vm.NameCriteria) || o.FirstName.Contains(vm.NameCriteria) || o.MiddleName.Contains(vm.NameCriteria) || o.Designation.Contains(vm.NameCriteria);

if (vm.PhoneNumberCriteria != null)

    exp += o => o.CentralPhoneNumbers.Any(child => child.PhoneNumber == vm.PhoneNumberCriteria);

//TODO set tempresults
tempresults = custs.All.Where(exp).ToList();

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

Спасибо

1 Ответ

3 голосов
/ 27 февраля 2012

Здесь есть две большие проблемы. Во-первых, вы используете делегаты, а не деревья выражений - это означает, что вся ваша таблица будет возвращена клиенту и отфильтрована там. Вы хотите Expression<Func<Parties, bool>>.

Теперь, если вы хотите построить "или" деревья выражений, самый простой подход - использовать PredicateBuilder:

var predicate = PredicateBuilder.False<Parties>();

if (vm.CustomerNumberCriteria != null)
{
    custID = Convert.ToInt32(vm.CustomerNumberCriteria);
    predicate = predicate.Or(o => o.ID == custID);
}

if (vm.NameCriteria != null)
{
    custID = Convert.ToInt32(vm.CustomerNumberCriteria);
    predicate = predicate.Or(o => o.LastName.Contains(vm.NameCriteria) /* etc */)
}

if (vm.PhoneNumberCriteria != null)
{
    predicate = predicate.Or(o => o.CentralPhoneNumbers.Any
                     (child => child.PhoneNumber == vm.PhoneNumberCriteria));
}

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