C# 获取全部';其中';使用ExpressionVisitor调用

C# 获取全部';其中';使用ExpressionVisitor调用,c#,linq,expression-trees,iqueryable,lambda,C#,Linq,Expression Trees,Iqueryable,Lambda,我有一个疑问,比如: var query = from sessions in dataSet where (names.Contains(sessions.Username)) where (sessions.Login.TimeOfAction == dt) select new { sessions.Username,

我有一个疑问,比如:

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;
        }
    }
我尝试过对这个类进行大量调整以返回where子句,但没有成功。找不到任何关于这个的好文档,有人能帮忙吗?我认为,这最终需要生成多个LambdaExpression对象

使用此处找到的类作为基础。然后您可以像这样创建访问者

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;
        }
    }
内部类WhereFinder:ExpressionVisitor
{
private IList whereExpressions=new List();
公共IList GetWhere(表达式)
{
参观(表达);
返回表达式;
}
受保护的重写表达式VisitMethodCall(MethodCallExpression表达式)
{
if(expression.Method.Name==“Where”)
其中表达式。添加(表达式);
访问(expression.Arguments[0]);
返回表达式;
}
}

谢谢,这很有效。还有一个问题…您知道是否可以从Exp树中删除某些where子句吗?在VisitMethodCall中,您正在将表达式添加到列表中。您可以进行某种测试,然后用常量条件替换第二个参数,而不是返回表达式。比如1==1