質問

私は非常に単純に見えるものをやろうとしていますが、私がそのより動的にしたいときに大規模な困難を打ちます。

    Expression<Func<TableServiceEntity, bool>> predicate = (e) => e.PartitionKey == "model" && (e.RowKey == "home" || e.RowKey == "shared");

context.CreateQuery<TableServiceEntity>(tableName).Where(predicate);
.

述語をハードコードする代わりにRowKeyの配列を渡したいと思います。

表情ツリーを構築しようとしたとき、私はサポートされていない例外を受け取りました私は表現ツリーの一部として呼び出しをサポートしていないと思います。

サポートされていない例外を避けるための述語とまったく構築されたツリーの構築方法と表現の木を知っていますか?

事前にありがとう

役に立ちましたか?

解決

だから、このようなものを使って動的にクエリを構築することができます( phluffyfotos サンプル):

        Expression<Func<PhotoTagRow, bool>> search = null;
        foreach (var tag in tags)
        {
            var id = tag.Trim().ToLowerInvariant();

            if (String.IsNullOrEmpty(id))
            {
                continue;
            }

            Expression<Func<PhotoTagRow, bool>> addendum = t => t.PartitionKey == id;

            if (search == null)
            {
                search = addendum;
            }
            else
            {
                search = Expression.Lambda<Func<PhotoTagRow, bool>>(Expression.OrElse(search.Body, addendum.Body), search.Parameters);
            }
        }
.

今、「検索」があると、Where句の述語としてそれを渡すことができます。

しかし、私はこれをしないように納得させたいです。私はあなたの質問に答えていますが、それが複数の '|をすることが悪い考えであることをあなたに言っていますまたはテーブルストレージの句その理由は、今日が少なくともこれらのクエリを最適化することができず、それらは全テーブルスキャンを引き起こすことです。パフォーマンスは、単語以外のデータで恐ろしいことになります。さらに、このように動的に述語を構築した場合、URLの制限を吹くリスクを実行します(留意してください)。

PhluffyFotosのこのコードはどのようにして示していますが、実際には悪い習慣です(私は知っています)。それは実際に各または節を並行して実行するように最適化されるべきです。それがあなたが本当にそれをするべきですか。そして句は大丈夫ですが、句は並列化されるべきです(plinqやtplを使用)、結果を集計する必要があります。それははるかに速くなります。

hth.

他のヒント

この種の照会についてフルテーブルスキャンをしていると言ったhhthは、私が読んだドキュメントから正しくないと思います。Azureは、パフォーマンスの大きな違いであるテーブルスキャンではなくパーティションスキャンを実行します。

ここに私の解決策は、これがベストプラクティスではないことを指摘したHTHからの答えを読んでください。

var parameter = Expression.Parameter(typeof(TableServiceEntity), "e");

var getPartitionKey = typeof(TableServiceEntity).GetProperty("PartitionKey").GetGetMethod();
var getRowKey = typeof(TableServiceEntity).GetProperty("RowKey").GetGetMethod();

var getPartition = Expression.Property(parameter, getPartitionKey);
var getRow = Expression.Property(parameter, getRowKey);

var constPartition = Expression.Constant("model", typeof(string));
var constRow1 = Expression.Constant("home", typeof(string));
var constRow2 = Expression.Constant("shared", typeof(string));

var equalPartition = Expression.Equal(getPartition, constPartition);
var equalRow1 = Expression.Equal(getRow, constRow1);
var equalRow2 = Expression.Equal(getRow, constRow2);

var and = Expression.AndAlso(equalPartition, Expression.OrElse(equalRow1, equalRow2));

return Expression.Lambda<Func<TableServiceEntity, bool>>(and, parameter);
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top