查詢文件(.NET)
DocumentDB 支援對儲存在每個集合中的 JSON 文件的豐富查詢。 ****
使用 LINQ 查詢
IQueryable<Family> familyQuery = this.client.CreateDocumentQuery<Family>(
UriFactory.CreateDocumentCollectionUri(databaseName, collectionName), queryOptions)
.Where(f => f.LastName == "Andersen");
使用 SQL 查詢
IQueryable<Family> familyQueryInSql = this.client.CreateDocumentQuery<Family>(
UriFactory.CreateDocumentCollectionUri(databaseName, collectionName),
"SELECT * FROM Family WHERE Family.lastName = 'Andersen'",
queryOptions);
LINQ 查詢的分頁
所述 FeedOptions 被用於設定 RequestContinuation 在第一查詢獲得的屬性:
public async Task<IEnumerable<Family>> QueryWithPagination(int Size_of_Page)
{
var queryOptions = new FeedOptions() { MaxItemCount = Size_of_Page };
string continuationToken = string.Empty;
do
{
if (!string.IsNullOrEmpty(continuationToken))
{
queryOptions.RequestContinuation = continuationToken;
}
IDocumentQuery<Family> familyQuery = this.client.CreateDocumentQuery<Family>(
UriFactory.CreateDocumentCollectionUri(databaseName, collectionName), queryOptions)
.Where(f => f.LastName == "Andersen").AsDocumentQuery();
var queryResult = await familyQuery.ExecuteNextAsync<Family>();
continuationToken = queryResult.ResponseContinuation;
yield return queryResult;
} while (!string.IsNullOrEmpty(continuationToken));
}
你始終可以呼叫一次並將 Continuation Token 返回給客戶端,以便在客戶端需要下一頁時傳送分頁請求。使用幫助程式類和副檔名:
public class PagedResults<T>
{
public PagedResults()
{
Results = new List<T>();
}
public string ContinuationToken { get; set; }
public List<T> Results { get; set; }
}
public async Task<PagedResults<Family>> QueryWithPagination(int Size_of_Page, string continuationToken = "")
{
var queryOptions = new FeedOptions() { MaxItemCount = Size_of_Page };
if (!string.IsNullOrEmpty(continuationToken))
{
queryOptions.RequestContinuation = continuationToken;
}
return await familyQuery = this.client.CreateDocumentQuery<Family>(
UriFactory.CreateDocumentCollectionUri(databaseName, collectionName), queryOptions)
.Where(f => f.LastName == "Andersen").ToPagedResults();
}
public static class DocumentDBExtensions
{
public static async Task<PagedResults<T>> ToPagedResults<T>(this IQueryable<T> source)
{
var documentQuery = source.AsDocumentQuery();
var results = new PagedResults<T>();
try
{
var queryResult = await documentQuery.ExecuteNextAsync<T>();
if (!queryResult.Any())
{
return results;
}
results.ContinuationToken = queryResult.ResponseContinuation;
results.Results.AddRange(queryResult);
}
catch
{
//documentQuery.ExecuteNextAsync throws an exception on empty queries
return results;
}
return results;
}
}