延续令牌 - CreateDocumentQuery ExecuteNextAsync函数不存在

0 c# azure azure-cosmosdb

我在azure documentDB平台的c#中开发.我尝试在我的应用程序中实现分页体系结构.我的代码:

var userQuery = _client.CreateDocumentQuery<User>(
                _uriUsersCollection, queryStr, options).AsDocumentQuery();
Run Code Online (Sandbox Code Playgroud)

我的代码在AsDocumentQuery()函数上显示错误(它不被识别为IQueryable方法的一部分(我在互联网上看到该函数识别的几个例子).所以当我尝试激活查询时.ExecuteNextAsync它不存在.我使用Microsoft.Azure.Documents.Client dll版本1.11.0.0.感谢您的帮助MAK

Mat*_*nta 6

对于带有Continuation Token的场景,我经常使用这个助手类:

public class PagedResults<T>
{
    public PagedResults()
    {
        Results = new List<T>();
    }
    /// <summary>
    /// Continuation Token for DocumentDB
    /// </summary>
    public string ContinuationToken { get; set; }

    /// <summary>
    /// Results
    /// </summary>
    public List<T> Results { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

有了这个扩展:

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 if there are no results
        return results;
    }

    return results;
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以在代码中或多或少地使用它:

var options = new FeedOptions() { MaxItemCount = 20 };//If 20 is your page size
var continuationToken = string.Empty;
var allResults = new List<User>();
do{
    if (!string.IsNullOrEmpty(continuationToken))
    {
            options.RequestContinuation = continuationToken;
    }
    var userQuery = _client.CreateDocumentQuery<User>(_uriUsersCollection, queryStr, options).ToPagedResults();
    continuationToken = userQuery.ContinuationToken;
    allResults.AddRange(userQuery.Results);     
}while(!string.IsNullOrEmpty(continuationToken));
Run Code Online (Sandbox Code Playgroud)