Вызвать внутреннее выражение C # со свойством члена параметра во внешнее выражение - PullRequest
4 голосов
/ 16 ноября 2010

Я использую 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 помочь мне?

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

1 Ответ

3 голосов
/ 16 ноября 2010

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

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())
...