使用ExpressionVisitor获取所有“where”调用

我有一个查询,像这样:

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’的类来获得第一个,该类来自TerraServer Web服务的自定义查询提供程序上的MSDN教程。

它是:

 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对象。

使用此处的课程http://msdn.microsoft.com/en-us/library/bb882521%28v=vs.90%29.aspx作为您的基础。 然后,您可以像这样创建您的访客

 internal class WhereFinder : ExpressionVisitor { private IList whereExpressions = new List(); public IList 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; } }