C# 为什么我的Azure Cosmos查询应该返回许多结果,却返回空结果?

C# 为什么我的Azure Cosmos查询应该返回许多结果,却返回空结果?,c#,azure-cosmosdb,C#,Azure Cosmosdb,我正在对我的Cosmos db实例运行一个查询,当我知道应该得到一些结果时,我偶尔会得到0个结果 var options = new QueryRequestOptions() { MaxItemCount = 25 }; var query = @" select c.id,c.callTime,c.direction,c.action,c.result,c

我正在对我的Cosmos db实例运行一个查询,当我知道应该得到一些结果时,我偶尔会得到0个结果

        var options = new QueryRequestOptions()
        {
            MaxItemCount = 25
        };
        var query = @"
                    select c.id,c.callTime,c.direction,c.action,c.result,c.duration,c.hasR,c.hasV,c.callersIndexed,c.callers,c.files
                    from c
                    where
                    c.ownerId=@ownerId
                    and c.callTime>=@dateFrom
                    and c.callTime<=@dateTo
                    and (CONTAINS(c.phoneNums_s, @name)
                    or CONTAINS(c.names_s, @name)
                    or CONTAINS(c.xNums_s, @name))
                    order by c.callTime desc";
        var queryIterator = container.GetItemQueryIterator<CallIndex>(new QueryDefinition(query)
        .WithParameter("@ownerId", "62371255008")
        .WithParameter("@name", "harr")
        .WithParameter("@dateFrom", dateFrom) // 5/30/2020 5:00:00 AM +00:00
        .WithParameter("@dateTo", dateTo) // 8/29/2020 4:59:59 AM +00:00
        .WithParameter("@xnum", null), requestOptions: options, continuationToken: null);
        if (queryIterator.HasMoreResults)
        {
            var feed = queryIterator.ReadNextAsync().Result;
            model.calls = feed.ToList(); //feed.Resource is empty; feed.Count is 0;
            model.CosmosContinuationToken = feed.ContinuationToken; //feed.ContinuationToken is populated with a large token value, indicating that there are more results, even though this fetch returned 0 items.
            model.TotalRecords = feed.Count(); // 0
        }
var options=newqueryrequestoptions()
{
MaxItemCount=25
};
变量查询=@“
选择c.id、c.callTime、c.direction、c.action、c.result、c.duration、c.hasR、c.hasV、c.callersIndexed、c.callers、c.files
来自c
哪里
c、 ownerId=@ownerId
和c.callTime>=@dateFrom
c.callTime=@dateFrom
和c.callTime尝试使用以下代码:

查询宇宙数据库方法:

public async Task<DocDbQueryResult> QueryCollectionBaseWithPagingInternalAsync(FeedOptions feedOptions, string queryString, IDictionary<string, object> queryParams, string collectionName)
        {
            string continuationToken = feedOptions.RequestContinuation;
            List<JObject> documents = new List<JObject>();
            IDictionary<string, object> properties = new Dictionary<string, object>();
            int executionCount = 0;
            double requestCharge = default(double);
            double totalRequestCharge = default(double);

            do
            {
                feedOptions.RequestContinuation = continuationToken;
                var query = this.documentDbClient.CreateDocumentQuery<JObject>(
                    UriFactory.CreateDocumentCollectionUri(this.databaseName, collectionName),
                    new SqlQuerySpec
                    {
                        QueryText = queryString,
                        Parameters = ToSqlQueryParamterCollection(queryParams),
                    },
                    feedOptions)
                .AsDocumentQuery();

                var response = await query.ExecuteNextAsync<JObject>().ConfigureAwait(false);
                documents.AddRange(response.AsEnumerable());
                executionCount++;
                requestCharge = executionCount == 1 ? response.RequestCharge : requestCharge;
                totalRequestCharge += response.RequestCharge;
                continuationToken = response.ResponseContinuation;
            }
            while (!string.IsNullOrWhiteSpace(continuationToken) && documents.Count < feedOptions.MaxItemCount);

            var pagedDocuments = documents.Take(feedOptions.MaxItemCount.Value);
            var result = new DocDbQueryResult
            {
                ResultSet = new JArray(pagedDocuments),
                TotalResults = Convert.ToInt32(pagedDocuments.Count()),
                ContinuationToken = continuationToken
            };

            // if query params are not null, use existing query params also to be passed as properties.
            if (queryParams != null)
            {
                properties = queryParams;
            }

            properties.Add("TotalRequestCharge", totalRequestCharge);
            properties.Add("ExecutionCount", executionCount);

            return result;
        }
private static SqlParameterCollection ToSqlQueryParamtereCollection(IDictionary<string, object> queryParams)
        {
            var coll = new SqlParameterCollection();
            if (queryParams != null)
            {
                foreach (var paramKey in queryParams.Keys)
                {
                    coll.Add(new SqlParameter(paramKey, queryParams[paramKey]));
                }
            }

            return coll;
        }
public async Task querycollectionbasewithpaginternalasync(FeedOptions、FeedOptions、string queryString、IDictionary queryParams、string collectionName)
{
string continuationToken=feedOptions.RequestContinuation;
列表文档=新列表();
IDictionary properties=新字典();
int executionCount=0;
double requestCharge=默认值(双倍);
double totalRequestCharge=默认值(双倍);
做
{
feedOptions.RequestContinuation=continuationToken;
var query=this.documentDbClient.CreateDocumentQuery(
UriFactory.CreateDocumentCollectionUri(this.databaseName,collectionName),
新SqlQuerySpec
{
QueryText=queryString,
参数=ToSqlQueryParameterCollection(queryParams),
},
馈线(可选)
.AsDocumentQuery();
var response=await query.ExecuteNextAsync().ConfigureAwait(false);
documents.AddRange(response.AsEnumerable());
executionCount++;
requestCharge=executionCount==1?响应。requestCharge:requestCharge;
totalRequestCharge+=response.RequestCharge;
continuationToken=response.ResponseContinuation;
}
而(!string.IsNullOrWhiteSpace(continuationToken)&&documents.Count
ToSqlQueryParameterCollection方法:

public async Task<DocDbQueryResult> QueryCollectionBaseWithPagingInternalAsync(FeedOptions feedOptions, string queryString, IDictionary<string, object> queryParams, string collectionName)
        {
            string continuationToken = feedOptions.RequestContinuation;
            List<JObject> documents = new List<JObject>();
            IDictionary<string, object> properties = new Dictionary<string, object>();
            int executionCount = 0;
            double requestCharge = default(double);
            double totalRequestCharge = default(double);

            do
            {
                feedOptions.RequestContinuation = continuationToken;
                var query = this.documentDbClient.CreateDocumentQuery<JObject>(
                    UriFactory.CreateDocumentCollectionUri(this.databaseName, collectionName),
                    new SqlQuerySpec
                    {
                        QueryText = queryString,
                        Parameters = ToSqlQueryParamterCollection(queryParams),
                    },
                    feedOptions)
                .AsDocumentQuery();

                var response = await query.ExecuteNextAsync<JObject>().ConfigureAwait(false);
                documents.AddRange(response.AsEnumerable());
                executionCount++;
                requestCharge = executionCount == 1 ? response.RequestCharge : requestCharge;
                totalRequestCharge += response.RequestCharge;
                continuationToken = response.ResponseContinuation;
            }
            while (!string.IsNullOrWhiteSpace(continuationToken) && documents.Count < feedOptions.MaxItemCount);

            var pagedDocuments = documents.Take(feedOptions.MaxItemCount.Value);
            var result = new DocDbQueryResult
            {
                ResultSet = new JArray(pagedDocuments),
                TotalResults = Convert.ToInt32(pagedDocuments.Count()),
                ContinuationToken = continuationToken
            };

            // if query params are not null, use existing query params also to be passed as properties.
            if (queryParams != null)
            {
                properties = queryParams;
            }

            properties.Add("TotalRequestCharge", totalRequestCharge);
            properties.Add("ExecutionCount", executionCount);

            return result;
        }
private static SqlParameterCollection ToSqlQueryParamtereCollection(IDictionary<string, object> queryParams)
        {
            var coll = new SqlParameterCollection();
            if (queryParams != null)
            {
                foreach (var paramKey in queryParams.Keys)
                {
                    coll.Add(new SqlParameter(paramKey, queryParams[paramKey]));
                }
            }

            return coll;
        }
私有静态SqlParameterCollection到SqlQueryParameterCollection(IDictionary queryParams)
{
var coll=新的SqlParameterCollection();
if(queryParams!=null)
{
foreach(queryParams.Keys中的var paramKey)
{
coll.Add(新的SqlParameter(paramKey,queryParams[paramKey]);
}
}
返回coll;
}
尝试使用以下代码:

查询宇宙数据库方法:

public async Task<DocDbQueryResult> QueryCollectionBaseWithPagingInternalAsync(FeedOptions feedOptions, string queryString, IDictionary<string, object> queryParams, string collectionName)
        {
            string continuationToken = feedOptions.RequestContinuation;
            List<JObject> documents = new List<JObject>();
            IDictionary<string, object> properties = new Dictionary<string, object>();
            int executionCount = 0;
            double requestCharge = default(double);
            double totalRequestCharge = default(double);

            do
            {
                feedOptions.RequestContinuation = continuationToken;
                var query = this.documentDbClient.CreateDocumentQuery<JObject>(
                    UriFactory.CreateDocumentCollectionUri(this.databaseName, collectionName),
                    new SqlQuerySpec
                    {
                        QueryText = queryString,
                        Parameters = ToSqlQueryParamterCollection(queryParams),
                    },
                    feedOptions)
                .AsDocumentQuery();

                var response = await query.ExecuteNextAsync<JObject>().ConfigureAwait(false);
                documents.AddRange(response.AsEnumerable());
                executionCount++;
                requestCharge = executionCount == 1 ? response.RequestCharge : requestCharge;
                totalRequestCharge += response.RequestCharge;
                continuationToken = response.ResponseContinuation;
            }
            while (!string.IsNullOrWhiteSpace(continuationToken) && documents.Count < feedOptions.MaxItemCount);

            var pagedDocuments = documents.Take(feedOptions.MaxItemCount.Value);
            var result = new DocDbQueryResult
            {
                ResultSet = new JArray(pagedDocuments),
                TotalResults = Convert.ToInt32(pagedDocuments.Count()),
                ContinuationToken = continuationToken
            };

            // if query params are not null, use existing query params also to be passed as properties.
            if (queryParams != null)
            {
                properties = queryParams;
            }

            properties.Add("TotalRequestCharge", totalRequestCharge);
            properties.Add("ExecutionCount", executionCount);

            return result;
        }
private static SqlParameterCollection ToSqlQueryParamtereCollection(IDictionary<string, object> queryParams)
        {
            var coll = new SqlParameterCollection();
            if (queryParams != null)
            {
                foreach (var paramKey in queryParams.Keys)
                {
                    coll.Add(new SqlParameter(paramKey, queryParams[paramKey]));
                }
            }

            return coll;
        }
public async Task querycollectionbasewithpaginternalasync(FeedOptions、FeedOptions、string queryString、IDictionary queryParams、string collectionName)
{
string continuationToken=feedOptions.RequestContinuation;
列表文档=新列表();
IDictionary properties=新字典();
int executionCount=0;
double requestCharge=默认值(双倍);
double totalRequestCharge=默认值(双倍);
做
{
feedOptions.RequestContinuation=continuationToken;
var query=this.documentDbClient.CreateDocumentQuery(
UriFactory.CreateDocumentCollectionUri(this.databaseName,collectionName),
新SqlQuerySpec
{
QueryText=queryString,
参数=ToSqlQueryParameterCollection(queryParams),
},
馈线(可选)
.AsDocumentQuery();
var response=await query.ExecuteNextAsync().ConfigureAwait(false);
documents.AddRange(response.AsEnumerable());
executionCount++;
requestCharge=executionCount==1?响应。requestCharge:requestCharge;
totalRequestCharge+=response.RequestCharge;
continuationToken=response.ResponseContinuation;
}
而(!string.IsNullOrWhiteSpace(continuationToken)&&documents.Count
ToSqlQueryParameterCollection方法: