2014-06-26 4 views
1

Мне интересно, как передать свойство объекта динамически как часть лямбда, которая будет использоваться в методе Where от IQueryable.Динамическая лямбда для метода Where in linq

Предположим, у меня есть этот код:

var list = new List<Item>(); 
... 

var filtered = list.AsQueryable().Where(x => x.SomePropertyA.Contains(someStringValue)); 

Моя задача состоит в том, чтобы сделать последнее утверждение в качестве универсального метода и использование параметра:

IQueryable<Item> SomeMethod(Expression<Func<Item, string>> expr, string stringValue) { 

    return list.AsQueryable().Where (???); 
} 

SomeMethod(x => x.SomePropertyA, someStringValue); 
SomeMethod(x => x.SomePropertyB, someStringValue); 

...

Мои кишки скажите мне, что мне придется использовать класс Expressions для вызова метода Contains строки, возвращаемой expr, но не уверен, как это сделать, поскольку я не очень fami лжец с этим ...

+1

во время выполнения вы выбираете то, что свойство передать метод? – terrybozzio

+0

Метод будет использоваться в разных местах, с разными объектами и различными свойствами. Задача состоит в том, чтобы сделать этот метод как можно более общим. – Vlad

+0

вы можете использовать [Reflection] (http://msdn.microsoft.com/en-us/library/ms173183.aspx), чтобы получить нужную вам собственность. – Caleb

ответ

1

Этот метод будет создавать требуемое выражение:

static Expression<Func<T, bool>> CreateContainsPredicate<T>(Expression<Func<T, string>> property, string value) 
{ 
    return Expression.Lambda<Func<T, bool>>(// Where() wants this kind of expression 
     Expression.Call(     // we need to call method 
      property.Body,     // on instance returned by passed expression 
      typeof(string).GetMethod("Contains", new [] { typeof(string) }), // call 'Contains()' 
      Expression.Constant(value)),  // pass value to Contains() method 
     property.Parameters);    // resulting expression has same parameters as input expression 
} 

Использование:

IQueryable<Item> SomeMethod(Expression<Func<Item, string>> expr, string stringValue) { 
    return list.AsQueryable().Where(CreateContainsPredicate<Item>(expr, stringValue)); 
} 
+0

Фантастично, именно то, что мне нужно! – Vlad

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