Вызов внутреннего выражения C # со свойством-членом параметра внешнего выражения

Я использую Albaharis PredicateBuilder, который можно найти здесь http://www.albahari.com/nutshell/predicatebuilder.aspx для фильтрации результатов в приложении Linq-to-SQL. Это отлично работает.

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

Например, у меня есть 2 класса, Order и Customer. У меня уже есть метод, который возвращает Expression<Func<Customer, bool>>, который построен с использованием вышеупомянутого построителя предикатов. Теперь я хочу повторно использовать это в моем Order методе фильтрации, который вернет Expression<Func<Customer, bool>>, каким-то образом передавая свойство Order.Customer (выражение?) В мой Customer метод фильтрации.

У меня есть что-то вроде этого (далеко не полное, но я надеюсь, что вы уловили идею):

public class CustomerSearchCriteria
{
    public Expression<Func<Customer, bool>> FilterPredicate()
    {
        // Start with predicate to include everything
        var result = PredicateBuilder.True<Customer>();

        // Build predicate from criteria
        if (!String.IsNullOrEmpty(this.Name))
        {
            result = result.And(c => SqlMethods.Like(c.Name, this.Name));
        }

        // etc. etc. etc

} 


public class OrderSearchCriteria
{
    public Expression<Func<Order, bool>> FilterPredicate()
    {
        // Start with predicate to include everything
        var result = PredicateBuilder.True<Order>();

        // Build predicate from criteria
        if (!String.IsNullOrEmpty(this.Reference))
        {
            result = result.And(o => SqlMethods.Like(o.Reference, this.Reference));
        }

        // etc. etc. etc
        // This is where I would like to do something like:
        // result = result.And(o => o.Customer "matches" this.CustomerCriteria.FilterPredicate()
} 

Может ли мне помочь какой-нибудь гуру выражений Linq?

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


person Darren    schedule 16.11.2010    source источник


Ответы (1)


Если вы используете LinqKit от Albaharis, у вас должно получиться что-то вроде этого:

var customerFilter = this.CustomerCriteria.FilterPredicate();
// create an expression that shows us invoking the filter on o.Customer
Expression<Func<Order, bool>> customerOrderFilter = 
    o => customerFilter.Invoke(o.Customer);
// "Expand" the expression: this creates a new expression tree
// where the "Invoke" is replaced by the actual predicate.
result = result.And(customerOrderFilter.Expand())
person StriplingWarrior    schedule 16.11.2010
comment
Большое спасибо. Это именно то, что мне нужно. Я использовал PredicateBuilder, но не включил и не просмотрел остальную часть LinqKit. - person Darren; 17.11.2010