使用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; } }