c# - VisitMethodCall 不访问每个部分

标签 c# linq iqueryable

我有一个表达式访问者将表达式转换为 url 格式。但它只转换最后调用的表达式。例如,如果我这样调用我的集合:

NetworkAccountStorage.Where<NetworkAccountModel>(x => x.ID + 1 > 0).Select(x => x.Name).Distinct()

Distinct 将是唯一访问的表达式。如何解决?

protected override Expression VisitMethodCall(MethodCallExpression m)
    {
        if (m.Method.DeclaringType == typeof(Queryable) && m.Method.Name == "Where")
        {
            sb.Append("$filter=");
            //this.Visit(m.Arguments[0]);
            //sb.Append(") AS T WHERE ");
            LambdaExpression lambda = (LambdaExpression)StripQuotes(m.Arguments[1]);
            this.Visit(lambda.Body);
            return m;
        }
        else if (m.Method.DeclaringType == typeof(Queryable) && m.Method.Name == "Select")
        {
            sb.Append("$select=");
            LambdaExpression lambda = (LambdaExpression)StripQuotes(m.Arguments[1]);
            this.Visit(lambda.Body);
            return m;
        }

        throw new NotSupportedException(string.Format("The method '{0}' is not supported", m.Method.Name));
    }

最佳答案

您需要通过调用您覆盖的基本方法来递归:

base.VisitMethodCall(...);

关于c# - VisitMethodCall 不访问每个部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14076312/

相关文章:

c# - 将简单的 Left Outer Join 和 group by SQL 语句转换为 Linq

c# - 从 IQueryable<T> 中删除 OrderBy

c# - C# 和 XML 中的有理数

c# - 获取具有相同类的第二个节点

linq - 带有 LINQ 的 Entity Framework 在 WHERE 子句中使用 CONTAINS 对于大整数列表非常慢

c# - 在另一个 IQueryable 源上执行表达式

c# - 返回 IQueryable 表达式而不执行数据库查询

c# - IQueryable 复杂顺序 $sort 中仅允许使用字段

c# - 更新具有多对多关系的断开连接的实体

c# - Entity Framework 可选的一对一关系不起作用