C# 为什么我的Azure Cosmos查询应该返回许多结果,却返回空结果?
我正在对我的Cosmos db实例运行一个查询,当我知道应该得到一些结果时,我偶尔会得到0个结果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
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方法: