2012-12-28 57 views
1

我有一個表達式訪問者將表達式轉換爲url格式。但它只是轉換最後調用的表達式。例如,如果我打電話給我的收藏這樣:VisitMethodCall不訪問每個部分

NetworkAccountStorage.Where<NetworkAccountModel>(x => x.ID + 1 > 0).Select(x => x.Name).Distinct() 

獨特將是唯一的表達式訪問。如何解決這個問題?

protected override Expression VisitMethodCall(MethodCallExpression m) 
    { 
     if (m.Method.DeclaringType == typeof(Queryable) && m.Method.Name == "Where") 
     { 
      sb.Append("$filter="); 
      //this.Visit(m.Arguments[0]); 
      //sb.Append(") AS T WHERE "); 
      LambdaExpression lambda = (LambdaExpression)StripQuotes(m.Arguments[1]); 
      this.Visit(lambda.Body); 
      return m; 
     } 
     else if (m.Method.DeclaringType == typeof(Queryable) && m.Method.Name == "Select") 
     { 
      sb.Append("$select="); 
      LambdaExpression lambda = (LambdaExpression)StripQuotes(m.Arguments[1]); 
      this.Visit(lambda.Body); 
      return m; 
     } 

     throw new NotSupportedException(string.Format("The method '{0}' is not supported", m.Method.Name)); 
    } 

回答

1

您需要遞歸。不同的需要this參數,它是。選擇呼叫等

+0

但是房產已被遞歸? –

+0

與Distinct的第一個參數綁定的表達式。可悲的是,我沒有任何例子躺在身邊,沒有時間讓一個 – sehe

+0

發現它。我只需要訪問參數[0] –

3

您需要通過調用你推翻基方法遞歸:

base.VisitMethodCall(...); 
+0

好點。這件事應該是簡單的,它是 – sehe

+0

所以你認爲這是正確的? m = m.Update(m.Object,m.Arguments); return base.VisitMethodCall(m); –

+0

修改m不起作用 - 它是一個局部變量(參數)。這是你的私人副本。試試這個(如果它不能立即工作,你需要修正它):'返回m.Update(base.Visit(m.Object),m.Arguments.Select(x => base.Visit(x )));'。不知道你稱之爲「更新」,但它必須有一個原因。 – usr