2010-12-23 45 views
3

我有一個查詢,像這樣:獲取所有「其中」呼叫使用ExpressionVisitor

var query = from sessions in dataSet 
        where (names.Contains(sessions.Username)) 
        where (sessions.Login.TimeOfAction == dt)      
        select new { sessions.Username, 
            sessions.Login, 
            sessions.Logout, sessions.Duration }; 

我想要實現的ExpressionVisitor提取兩個where子句爲lambda的,但到目前爲止只能夠得到第一個使用名爲'InnermostWhereFinder'的類,該類來自MSDN教程,用於TerraServer Web服務的自定義查詢提供程序。

是:

internal class InnermostWhereFinder : ExpressionVisitor 
    { 
     private MethodCallExpression innermostWhereExpression; 

     public MethodCallExpression GetInnermostWhere(Expression expression) 
     { 
      Visit(expression); 
      return innermostWhereExpression; 
     } 

     protected override Expression VisitMethodCall(MethodCallExpression expression) 
     { 
      if (expression.Method.Name == "Where") 
       innermostWhereExpression = expression; 

      Visit(expression.Arguments[0]); 

      return expression; 
     } 
    } 

伊夫試圖調整這一類巨資返回兩種情況:沒有成功的條款。找不到任何有關這方面的優秀文檔,任何人都可以幫忙嗎?這將最終需要導致我可以使用多個LambdaExpression對象,我認爲。

回答

6

使用此處找到的類http://msdn.microsoft.com/en-us/library/bb882521%28v=vs.90%29.aspx作爲您的基礎。然後你可以創建你的這樣的訪客

internal class WhereFinder : ExpressionVisitor 
    { 
     private IList<MethodCallExpression> whereExpressions = new List<MethodCallExpression>(); 

     public IList<MethodCallExpression> GetWhere(Expression expression) 
     { 
      Visit(expression); 
      return whereExpressions; 
     } 

     protected override Expression VisitMethodCall(MethodCallExpression expression) 
     { 
      if (expression.Method.Name == "Where") 
       whereExpressions.Add(expression); 

      Visit(expression.Arguments[0]); 

      return expression; 
     } 
    } 
+0

謝謝,這是有效的。還有一個問題......你知道是否可以從Exp樹中刪除某些where子句? – Sean 2010-12-23 19:38:33