Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
 Как написать динамическое лямбда выражение?  [new]
Solomka
Member

Откуда: Москва
Сообщений: 186
Грубо говоря, что есть постоянное выражение, если вдруг переменная равна нулю.
А если не равна нулю, то изменить эту ламбду.
Хотелось бы написать что-то подобное:

               Expression<Func<Company, bool>> selectCompany = null;
 
                if (filter == null)
                {
                    selectCompany = x => x.CompanyId > 1;
                }
                else
                {
                    selectCompany = x => x.CompanyId > 1 ;

                    if (filter != null)
                    {
                        if (!string.IsNullOrWhiteSpace(filter.Name))
                            selectCompany = selectCompany && x => x.FullName.ToLower().Contains(filter.Name.ToLower().Trim());

                        if (!string.IsNullOrWhiteSpace(filter.Population))
                            selectCompany = selectCompany && x => x.PopulationToString.ToLower().Contains(filter.Population.ToLower().Trim());

                        if (!string.IsNullOrWhiteSpace(filter.RegionCity))
                            selectCompany = selectCompany && x => x.RegionCity.ToLower().Contains(filter.RegionCity.ToLower().Trim());
                    }
                }

                var retLst = uow.GetRepository<Company>().GetAll()                 
                   .Where(selectCompany)
                   .ToList();


Но оно не компилируется...
16 ноя 18, 10:24    [21736004]     Ответить | Цитировать Сообщить модератору
 Re: Как написать динамическое лямбда выражение?  [new]
hVostt
Member

Откуда:
Сообщений: 18578
Solomka,

Для построения динамических выражений в рантайме нужно использовать класс Expression и его статические методы.

а не вот это вот


Solomka
selectCompany = selectCompany && x => x.FullName.ToLower().Contains(filter.Name.ToLower().Trim());


Тут задача нормально решается через IQueryable, не нужны expresisons.
16 ноя 18, 10:38    [21736023]     Ответить | Цитировать Сообщить модератору
 Re: Как написать динамическое лямбда выражение?  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
Solomka, гуглить по словам predicate builder... Dynamically Composing Expression Predicates, Устранение дублирования Where Expressions в приложении
16 ноя 18, 10:38    [21736025]     Ответить | Цитировать Сообщить модератору
 Re: Как написать динамическое лямбда выражение?  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
зы - хвост прав, но всякое бывает...
16 ноя 18, 10:39    [21736027]     Ответить | Цитировать Сообщить модератору
 Re: Как написать динамическое лямбда выражение?  [new]
monstrU
Member

Откуда: Москва
Сообщений: 1221
Solomka,

для динамических выражений хорошо подходил predicatebilder
3 дек 18, 14:16    [21752060]     Ответить | Цитировать Сообщить модератору
 Re: Как написать динамическое лямбда выражение?  [new]
fkthat
Member

Откуда:
Сообщений: 3936
Solomka, можно не возиться с лямбдами, а просто сделать так:

var q = uow.GetRepository<Company>().GetAll().Where(x => x.CompanyId > 1);

if (filter != null)
{
     if (!string.IsNullOrWhiteSpace(filter.Name))
           q = q.Where(x => x.FullName.ToLower().Contains(filter.Name.ToLower().Trim()));

     if (!string.IsNullOrWhiteSpace(filter.Population))
           q = q.Where(x => x.PopulationToString.ToLower().Contains(filter.Population.ToLower().Trim()));

     if (!string.IsNullOrWhiteSpace(filter.RegionCity))
           q = q.Where(x => x.RegionCity.ToLower().Contains(filter.RegionCity.ToLower().Trim()));
}

return q.ToList();
3 дек 18, 14:56    [21752137]     Ответить | Цитировать Сообщить модератору
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить