2013-05-07 5 views
0

У меня есть серия объектов, все из которых имеют аналогичное свойство, которое является списком идентификаторов групп, к которым они принадлежат (много родителей на ребенка).Динамические данные - реализация IQueryable для списка <int> Содержит()

У меня возникли проблемы с программной реализацией выражения Linq, необходимого для правильной работы фильтра.

Это то, что я до сих пор:

IQueryable result = null; 

    if (!string.IsNullOrWhiteSpace(this.ddlRouteNames.SelectedValue)) 
    { 
     ConstantExpression ce = Expression.Constant(int.Parse(this.ddlRouteNames.SelectedValue)); 
     ParameterExpression pe = Expression.Parameter(source.ElementType); 
     MemberExpression me = Expression.Property(pe, this.Column.Name); 
     MethodCallExpression mce = Expression.Call(typeof(List<int>), "Contains", new[] { typeof(int) }, me, ce); 

     result = source.Provider.CreateQuery(mce); 
    } 

return result; 

Я получаю исключение при попытке создать свой MethodCallExpression:

Ни один метод «не содержит» существует на типе «System.Collections .Generic.List`1 [System.Int32]».

Любые указатели с чего начать?

+0

Я запутался, вы должны были это почти прямо [ваш предыдущий вопрос] (http://stackoverflow.com/q/16347794/41071). – svick

+0

В этом вопросе метод был статичным. –

+0

Другой вопрос приводит к исключению при попытке создать запрос: «Выражение аргумента не реализует System.Linq.IQueryable'1 [System.Boolean]». –

ответ

0

Type в подписи методы вы использовали:

public static MethodCallExpression Call(Type type, 
             string methodName, 
             Type[] typeArguments, 
             params Expression[] arguments); 

определяет тип, который содержит специальный статического метода.

Вам нужен экземпляр типа для этого метода, чтобы быть в наличии - пример (связанный с вашим комментарием):

var par = Expression.Parameter(typeof(int), "par");    
var inst = Expression.Parameter(typeof(List<int>), "inst"); 
var body = Expression.Call(inst, typeof(List<int>).GetMethod("Contains"), par); 
var exp = Expression.Lambda(body, inst, par); 
var deleg = exp.Compile(); 

var lst = new List<int>() { 1, 2, 3, 4, 5 }; 
var exists = deleg.DynamicInvoke(lst, 3); 
+0

Спасибо. Есть ли что-то подобное, что я могу использовать, чтобы достичь желаемых результатов? Я, по сути, пытаюсь написать выражение, которое увидит, будет ли выбранный идентификатор отображаться в списке объектов идентификаторов. –

0

Ваш вызов метода не является правильным, чтобы вызвать нестатический метод вас необходимо предоставить экземпляр, содержащий этот метод. Вот пример Contains вызова метода:

var list = new List<int> {1}; 
//Target for invoke method 
var target = Expression.Constant(list); 
var methodCallExpression = Expression.Call(target, typeof(List<int>).GetMethod("Contains"), Expression.Constant(1)); 

Если в вашем коде me это элемент, который содержит List код будет выглядеть следующим образом:

Expression.Call(me, typeof(List<int>).GetMethod("Contains"), ce); 
+0

Как ближе ... Часть MethodCallExpression работает корректно, но когда я пытаюсь использовать источник IQueryable для создания запроса, я получаю это исключение: «Выражение аргумента не реализует System.Linq.IQueryable'1 [System .Boolean] «. –

+0

Какой тип переменной 'source'? –

+0

Источник - это IQueryable, который передается в метод GetQueryable, который переопределяется из наследования из QueryableFilterUserControl. –