2013-09-02 7 views
0

У меня есть такое выражение:Экспрессия недостаточность

Linq2Rest.Reactive.InnerRestObservable`1[A] 
    .Where(item => (Convert(IIF((item != null), item.ID, 0)) == Convert(61))) 
    .Skip(0) 
    .Take(20) 

Когда я призываю Subscribe method на него я получаю такую ​​ошибку:

variable 'item' of type 'A' referenced from scope '', but it is not defined

Не могу понять, в чем проблема. На самом деле не видно никаких проблем с аргументом item ...

UPD. Где раздел построен с этим кодом:

public static IQbservable WhereExpression(this IQbservable query, Expression filterExpression, ParameterExpression instance = null) 
     { 
      if (instance == null) 
       instance = Expression.Parameter(query.ElementType, "item"); // NOI18N 

      var filteredQuery = (IQbservable)GenericsHelper.InvokeGenericExtensionMethod(
       typeof(Qbservable), 
       "Where", // NOI18N 
       new[] { query.ElementType }, 
       query, 
       Expression.Lambda(filterExpression, instance) 
      ); 

      return filteredQuery; 
     } 
public static object InvokeGenericExtensionMethod(
      Type extensionClass, 
      string extensionMethodName, 
      Type[] genericTypes, 
      params object[] parameters 
     ) 
     { 
      var method = extensionClass.GetMethods().FirstOrDefault(m => 
       m.Name == extensionMethodName && 
       m.IsGenericMethod && 
       m.GetGenericArguments().Length == genericTypes.Length && 
       m.GetParameters().Length == parameters.Length 
      ); 

      if (method == null) 
       throw new ArgumentException(string.Format("Type {0} doesn't contain method {1}", extensionClass.Name, extensionMethodName)); // NOI18N 

      var genericMethod = method.MakeGenericMethod(genericTypes); 

      return genericMethod.Invoke(null, parameters); 
     } 

UPD 2. Это как WhereExpression звонки:

foreach (var filter in filters) 
      { 
       var paramExpression = Expression.Parameter(query.ElementType, "item"); // NOI18N 
       query = query.WhereExpression(filter.CreateFilterExpression(paramExpression), paramExpression); 
      } 

фильтров является сбор интерфейса IFilterDescriptor от Telerik.

+0

Что такое обратный тик до '1'? Что-то вроде функции .NET 6.0? –

+1

@KingKing: Это имя общего класса. это было так, так как generics были внедрены в .NET 2.0. Пример: 'new List () .GetType(). ToString()' дает 'System.Collections.Generic.List \' 1 [System.String] ' –

+0

@Pavel: Кто создает это выражение? Если вы построите его с кодом, пожалуйста, покажите этот код. –

ответ

1

Вы должны использовать такой же экземпляр ParameterExpression как в качестве параметра, так и в теле выражения.

Проще всего просто использовать одно из выражения фильтра, используя его полностью.

+0

Я передаю экземпляр ParameterExpression, и он является единственным, который передал Expression.Lambda (filterExpression, instance) в качестве переменной экземпляра. Таким образом, существует только одно ParameterExpression. –

+0

@ Pavel.S .: Пожалуйста, покажите, как вы называете 'WhereExpression'. Обратите внимание, что тело выражения фильтра содержит ссылку на экземпляр ParameterExpression. Это тот, который вам нужно использовать повсюду. –

+0

См. Upd 2. для получения дополнительной информации. –

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