1

式を 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));
    }
4

2 に答える 2

3

オーバーライドした基本メソッドを呼び出して、再帰する必要があります。

base.VisitMethodCall(...);
于 2012-12-28T22:27:33.560 に答える
1

再帰する必要があります。Distinctthisは、.Select 呼び出しなどのパラメーターを受け取ります。

于 2012-12-28T22:07:35.093 に答える