4

かなり長い間検索した後でも、探している答えが見つかりません。ツリーのパラメーターの追加と削除に関する回答は見つかりましたが、特定のパラメーターの置き換えに関する回答は見つかりませんでした。

私の最初の方法は、希望どおりに機能しています。partitionKey 値を Uri エスケープ値に置き換えてから、エスケープされていない結果を返す必要があります。

public override IList<T> GetRowEntityList(string partitionKey)
{
    IList<T> rowEntities =  base.GetRowEntityList(Uri.EscapeDataString(partitionKey));
    return rowEntities.Select(UnEscapeRowEntity).ToList();
}

私が抱えている問題は、このメソッドをオーバーライドして同じように動作させることです。Ttypeにはプロパティがあることは既に知っていますが、他の数のプロパティを持つこともできます PartitionKeyRowKey

サンプルの述語の場合:

x => x.RowKey == "foo/bar" && x.SomeValue == "test" 

私はそれが

x => x.RowKey == Uri.EscapeDataString("foo/bar") && x.SomeValue == "test"  

これを行う方法はありますか?

私の基本クラスは、この述語を使用して、呼び出しTを使用するタイプのエンティティを含むテーブルでテーブル ルックアップを行います。Where(predicate)

public override IList<T> GetRowEntityList(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
{
    //modify predicate value here

    return base.GetRowEntityList(predicate);
}
4

1 に答える 1

2

ExpressionVisitorを実装する必要があります。

class MyVisitor : ExpressionVisitor
{
    protected override Expression VisitBinary(BinaryExpression node)
    {
        if(CheckForMatch(node.Left))
            return Expression.Equal(node.Left, Rewrite(node.Right));

        if(CheckForMatch(node.Right))
            return Expression.Equal(Rewrite(node.Left), node.Right);

        return Expression.MakeBinary(node.NodeType, Visit(node.Left), Visit(node.Right));
    }

    private bool CheckForMatch(Expression e)
    {
        MemberExpression me = e as MemberExpression;
        if(me == null)
            return false;

        if(me.Member.Name == "RowKey" || me.Member.Name == "PartitionKey")
            return true;
        else
            return false;
    }

    private Expression Rewrite(Expression e)
    {
        MethodInfo mi = typeof(Uri).GetMethod("EscapeDataString");

        return Expression.Call(mi, e);
    }
}

その通りだと思います。テストするのは少し難しいです。これは の限られたケースでのみ機能することに注意してください(x => x.RowKey == "some string")。では機能しません(x => x.RowKey.Equals("somestring")。に対しても機能しません(x => x.RowKey() == "some string")

次に、実装されたビジターを使用して述語を書き直します。

Expression<Func<T, bool>> predicate = (s => s.RowKey == "1 2");

ExpressionVisitor v = new MyVisitor();
Expression<Func<T, bool>> rewrittenPredicate = v.Visit(predicate);

//rewrittenPredicate then tests if s.RowKey == "1%202"
于 2013-04-09T19:50:51.073 に答える