2017-06-15 3 views
1

documentDbに対してlinqカウントクエリを実行するときにRequestChargeを取得できますか? 例えばサンプルLINQクエリDocumentDb集約オペレーションのRequestCharge

count = client.CreateDocumentQuery<Family>(collectionUri, DefaultOptions) 
     .Where(f => f.LastName == "Andersen") 
     .Count(); 

おかげ

ドナル

答えて

1

はdocumentDbに対するLINQカウントクエリを実行するときRequestChargeを取得することが可能ですか?

documentDbに対してlinqカウントクエリを使用する場合は、Countメソッドの前にToListメソッドを呼び出す必要があります。

.ToList().Count(); 

これは、documentDbサーバーに複数のクエリを送信し、すべてのドキュメントを戻します。 ToList()を呼び出すと、Fiddlerで見つかったリクエストリストを次に示します。Count()。私のコレクションには2つのドキュメントしかないので、2/dbs/ToDoList/colls/Itemsリクエストが送信されます。

enter image description here

次のコードを使用して一緒に追加することができ、次のコードとRequestChargesに等しいです。

IDocumentQuery<T> query = client.CreateDocumentQuery<Family>(collectionUri, DefaultOptions) 
    .Where(f => f.LastName == "Andersen") 
    .AsDocumentQuery(); 

List<T> results = new List<T>(); 
double sumRequestCharges = 0; 
while (query.HasMoreResults) 
{ 
    FeedResponse<T> queryResult = await query.ExecuteNextAsync<T>(); 
    sumRequestCharges += queryResult.RequestCharge; 
    results.AddRange(queryResult); 
} 

ドキュメントのカウントを照会するだけであれば、.ToListメソッドの代わりにSQLクエリを使用することをお勧めします。それはdocumentDbサーバーに複数の要求を送信することはありませんし、多くの時間を節約します。下記のコードは参照用です。

var query = client.CreateDocumentQuery<object>(
    UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId),new SqlQuerySpec("SELECT count(c.id) FROM c")).AsDocumentQuery(); 
FeedResponse <object> queryResult = await query.ExecuteNextAsync<object>(); 
double requestCharge = queryResult.RequestCharge; 
+0

ありがとうAmor私はSQLのselectクエリを再生し、その生成内容を確認します。私が作業していたドキュメントdbクエリサンプルは、ToListメソッドを使用しないことに注意してください。 –

+0

Countメソッドを直接呼び出すと例外がスローされます。あなたの側で動作する場合は、Fiddlerを使用してCountメソッドを呼び出したときに送信された要求の数を確認できます。 – Amor

+0

こんにちはAmor、DocumentClientが行う3回の呼び出しについては、このリンクを参照してください - https://stackoverflow.com/questions/44590614/documentdb-query-that-expects-full-results-from-aggregate-functions-is-not-sup –