私のアプリケーションでは、partitionkeyが定数ですが行の文字列がレキシカル範囲内にあるすべてのエンティティを取得するクエリを作成するアプリケーションでよく発生します)いくつかのプレフィックスで:などSTARTSWITHなどの文字列関数は、クエリのこの種ではサポートされていないため一般的に使用されている条件がメソッドにラップされたAzureテーブルの格納域のクエリ
//query to get all entities in partition "KnownPartition" where RowKey starts with "Prefix_"
CloudTableQuery<MyEntity> query =
(from e in tableServiceContext.CreateQuery<MyEntity>(tableName)
where e.PartitionKey == "KnownPartition"
&& e.RowKey.CompareTo("Prefix_") > 0
&& e.RowKey.CompareTo("Prefix`") <= 0 // ` is '_' + 1
select e).AsTableServiceQuery();
私はのCompareToを使用する必要があります。これはうまくいきますが、その状態は読みにくく、繰り返したくさんあります。だからではなく、この読みにくい条件でクエリをたくさん書いて、私はむしろそれを「インライン化」機能をしたいのですが:
public static Boolean HasPrefix(this String rowKey, String prefix)
{
return rowKey.CompareTo(prefix + '_') > 0 && rowKey.CompareTo(prefix + '`') <= 0;
}
CloudTableQuery<MyEntity> query =
(from e in tableServiceContext.CreateQuery<MyEntity>(tableName)
where e.PartitionKey == "KnownPartition" && e.RowKey.HasPrefix("Prefix")
select e).AsTableServiceQuery();
しかし、私はこれを実行すると、私はから例外を取得私の機能についてのAzureはサポートされていません。サポートされるようにこれを書く方法はありますか?結局のところ、私は機能しているクエリとまったく同じ条件を使用しています...
非常にクールです。ありがとうございました。私は、すべての式をlinqクエリ構文ではなくむしろメソッドチェーンとして書くことができると思います。 –
ああ、ところで、私はこれがフルスキャンにならないことを願っています...実際には、azureから実際に転送されたエンティティはプレフィックス条件がチェックされています。 –
結果AzureストレージリクエストURIは次のとおりです。https://foo.table.core.windows.net/tablename()?$filter=((PartitionKey eq 'KnownPartition')および(RowKey gt 'Prefix_'))および(RowKey le 'Prefix%60')。したがって、すべての条件を満たす行のみが返されます。さらに、問合せではパーティション・キーと行キーの範囲が指定されているため、バックエンドでもフル・テーブル・スキャンは不要です。 – Kevin