2015-04-09 5 views
0

Рассмотрим следующий класс:Как добавить условие к существующему выражению лямбда?

public class Customer 
{ 
    public int Id {get; set;} 
    public int GroupId {get; set;} 
    public int Number {get; set;} 
    public string Name {get; set;} 
} 

У меня есть метод в служебный слой, который делает:

public Customer Get(Expression<Func<Customer, bool>> where) 
{ 
    return customerRepository.Get(where); 
} 

Вызывающий код является:

var customer = customerService.Get(x => x.Number == number); 

В приведенном выше способе пользователь ищет клиента на основе свойства (исключая GroupId, поскольку он скрыт в ViewModel). Тем не менее, пользователь всегда назначается группе, и поэтому ему разрешено искать клиентов в пределах своей группы. Таким образом, необходимо добавить динамическое добавление GroupId.

Как добавить GroupId в выражение where в методе выше. GroupId может быть или не быть уже доступным в выражении.

+0

взгляд в [predicatebuilder] (http://www.albahari.com/nutshell/predicatebuilder.aspx) – DLeh

ответ

3

Используя PredicateBuilder, вы можете помочь создать выражения, которые вы можете добавить на свои звонки. Это позволит вам сделать что-то вроде ниже.

public void DoSearch(MyViewModel vm) 
{ 
    Expression<Func<Customer, bool>> myFilter = x => yourCurrentFilterLogic; 
    var combined = myFilter.And(x => x.GroupId == vm.GroupId); //PredicateBuilder extension method 
    var customers = Get(combined); 
} 

public Customer Get(Expression<Func<Customer, bool>> where) 
{ 
    return customerRepository.Get(where); 
} 
+1

Зачем вам нужен PredicateBuilder, а не просто '.где (х => x.Id = = groupID)? ' – xanatos

+0

Я сделал лучший пример, который показывает построение одного выражения для отправки его методу' Get() ', который показывает, почему я думал о' PredicateBuilder'. Он не предоставил код, который показывает его первое выражение, поэтому не совсем ясно, понадобится ли «PredicateBuilder» или нет. – DLeh

+1

@xanatos Пробовал расширение PredicateBuilder. Я получаю исключение: «Тип узла выражения LINQ« Invoke »не поддерживается в LINQ to Entities' –

Смежные вопросы