1

を使用しTableServiceContextてAzureTableStorageをクエリする場合、次のようなクエリを実行します。

var entities = context.CreateQuery<TEntity>(TableName)
                      .AsTableServiceQuery()
                      .Where(condition);

ただし、これは新しいClient StorageLibrary2.0ではコンパイルされません。

メソッド'AsTableServiceQuery'のオーバーロードは0個の引数を取ります。

利用可能な唯一の方法はAsTableServiceQuery(TableServiceContext context);

これは、次のものが必要になることを意味します。

var entities = context.CreateQuery<TEntity>(TableName)
                      .AsTableServiceQuery(context)
                      .Where(condition);

コンテキストを2回提供しています。なんで?

4

1 に答える 1

2

IQueryProviderが機能する方法は、各Linq拡張機能が実際に式ツリーを変更し、CreateQueryを介してそれをプロバイダー自体に渡すことです。

http://msdn.microsoft.com/en-us/library/system.linq.iqueryprovider.aspxを参照してください)

参照している実装はWCFDataServicesであるため、公開されたプロバイダーはTableServiceQueryではなくDataServiceQueryを作成し、基本的にAzure固有のラッパーを取り除きます。残念ながら、DataServiceQueryは、一部の機能と特定の信頼性チェックに必要な関連コンテキストを公開しません。したがって、最終的なソリューションでは、クエリが正しくラップされ、作成元のコンテキストに関連付けられていることを確認するために、この最後のメソッドがコンテキストを再度受け入れる必要があります。

DataServiceQueryは継続をサポートしていないことに注意してください。そのため、Azureテーブルに対してクエリを実行する場合は、このラッピングが確実に実行されるように、常にAsTableServiceQuery(ctx)拡張機能を使用する必要があります。

また、.Table名前空間に導入された新しいテーブルサービスレイヤーを確認することをお勧めします。これにより、柔軟性が向上し、パフォーマンスが大幅に向上し、これらの複雑さが回避されます。TSLは現在IQueryProviderを公開していないことに注意してください。

お役に立てれば、

ジョー

于 2013-02-27T23:03:20.657 に答える