首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在ExpressionVisitor之后找到SelectMany表达式的位置

无法在ExpressionVisitor之后找到SelectMany表达式的位置
EN

Stack Overflow用户
提问于 2018-03-26 13:59:05
回答 1查看 147关注 0票数 0

我有一个ExpressionVisitor派生类,它具有以下重写的VisitMethodCall()方法。

代码语言:javascript
复制
class CommonExpressionVisitor : ExpressionVisitor
{
    protected override Expression VisitMethodCall(MethodCallExpression node)
    {
        if (node.Method.DeclaringType == typeof(Queryable))
        {
            switch (node.Method.Name)
            {
                case nameof(Queryable.Where):
                    Visit(node.Arguments[0]);
                    return node;

                case nameof(Queryable.Select):
                    Visit(node.Arguments[0]);
                    return node;

                case nameof(Queryable.SelectMany):
                    Visit(node.Arguments[0]);
                    Visit(node.Arguments[1]);
                    Visit(node.Arguments[2]);
                    return node;
            }
        }
        return base.VisitMethodCall(node);
    }
}

当查询中没有Where调用时,访问者可以很容易地找到SelectMany表达式。例如:

代码语言:javascript
复制
var queryable = from item in collection
                where item.X >= 0 && item.Y >= 0
                select item;

但是,如果查询包含SelectMany,则整个Where表达式将消失,访问者无法再访问它。

代码语言:javascript
复制
var queryable = from item in collection
                from sub in item.SubItems
                where sub.A >= 0 && sub.B >= 0
                select sub;

如何修复我的ExpressionVisitor以找到Where表达式?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-03 02:04:49

回答我自己的问题。表达式有两个阶段。在第一阶段,调用IQueryable.Provider属性以生成由两个变量itemsub组成的匿名对象。在第二阶段,在表达式现在包含匿名类型和where子句的地方再次调用相同的属性。因此,where子句并没有消失,它只是处于第二阶段。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49493283

复制
相关文章

相似问题

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