2013-09-02 2 views
0

내가있어 이러한 표현 : 나는 그것에 Subscribe method를 호출 할 때표현 실패

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

내가 같은 오류를받을 :

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

이 문제가 무엇인지 알아낼 수 없습니다. 실제로 항목 인수에 문제가 보이지 않습니다 ...

UPD. 이 코드로 구축 Where 절 :

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

필터 telerik에서 IFilterDescriptor 인터페이스의 모음입니다 :

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 호출하는 방법이다.

+0

'1' 전에 백 tick이란 무엇입니까? 어떤 종류의'.NET 6.0' 기능? –

+1

@KingKing : 일반 클래스의 이름입니다. .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.를 참조하십시오. –