1

Azure Table Storage のテーブルに保存する Person クラスがあります。

次のクエリのいずれかでクエリを実行したい:

var query = from getThis in _serviceContext.CreateQuery<PersonForSearch>(_tableName)
                        where getThis.Name.Contains(searchTerm)
                        select new Person
                        {
                            PartitionKey = getThis.PartitionKey, 
                            RowKey = getThis.RowKey,
                            Name = getThis.Name
                        };

また

CloudTableQuery<Person> query =
                 (from getThis in _serviceContext.CreateQuery<Person>(_tableName)
                  where getThis.Name.Contains(searchTerm)
                  select getThis).AsTableServiceQuery<Person>();

いずれの場合も、クエリの結果をループするために使用する foreach ループで次のエラーがスローされます。

NotImplemented 要求された操作は、指定されたリソースに実装されていません。

おそらくこれは、私の Person モデルが TableServiceEntity から継承されていないという事実に起因すると考えました (その結合を導入することを拒否するため、代わりにこの属性で装飾しました: [DataServiceKey("PartitionKey", "RowKey")] 手動で与えたこれは PartitionKey および RowKey プロパティです。

そこで、DID が TableServiceEntity から継承するエンティティを作成しようとしました。これにより、このテーブルをクエリできるようになります (クエリからわかるように、私が心配している唯一のプロパティは Name です)。

この新しいエンティティは次のとおりです。

class PersonForSearch : TableServiceEntity
{
    public string Name { get; set; }
}

ただし、これで問題は解決していません。このエラーは、クエリで使用しているクラス以外のリソースに関するものですか?

4

1 に答える 1

4

ここには2つの問題があります。

1)Azure Table StorageはContains()メソッドをサポートしていません。これが、実装されていない例外が発生する理由です。ATSは、文字列に対する範囲タイプの操作に対してstring.Compare()をサポートします。

2)データを効果的に取得するために、PartitionKeyまたはPartitionKey/RowKeyの組み合わせでのみ検索できます。他のクエリを実行すると、エラーが発生するか、テーブル全体がクライアントのメモリにダウンロードされます(どちらを思い出せないか)。テーブルが小さい場合は、「where」句を削除してテーブルを完全にメモリにダウンロードし、その後、LinqforObjectsを使用して任意のクエリを実行します。大きい場合は、PartitionKeyまたはPartitionKey/RowKeyフィールドと比較する方法を見つけてください

あなたが正しくやろうとしていることを私が理解しているのなら、あなたは部分的な文字列をやろうとしているということです-従業員テーブルを検索してください。全体として、ATSは、文字列ベースの検索を実行するための非常に優れたソリューションではありません(PartitionKeyまたはPartitionKey / RowKeyフィールドでの「開始」検索でない限り)。クラウドでテキストベースの検索を行うには、Lucene.NETを強くお勧めします。Lucene.NET用のAzureDirectoryAPIも利用できます。または、SQLAzureに切り替えます

HTH

于 2012-11-18T03:51:31.833 に答える