首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ExpressionVisitor获取所有“where”调用

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

Stack Overflow用户
提问于 2010-12-23 10:58:49
回答 1查看 3.5K关注 0票数 3

我有一个问题,如下所示:

代码语言:javascript
复制
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教程。

它是:

代码语言:javascript
复制
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对象。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-23 11:16:11

使用在这里找到的http://msdn.microsoft.com/en-us/library/bb882521%28v=vs.90%29.aspx类作为基础。然后您可以像这样创建您的访问者

代码语言:javascript
复制
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;
        }
    }
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4515550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档