Performance dotnet core azure documentdb linq lambda查询未在服务器上运行查询
我正在运行dotnetcore并访问documentdb 当我尝试使用linq where子句运行查询时,它会返回,但这需要很长时间,而且似乎无法在服务器上进行筛选。我可以通过使用SqlQuerySpec来运行查询来解决这个问题,现在它似乎可以在服务器上运行查询条件Performance dotnet core azure documentdb linq lambda查询未在服务器上运行查询,performance,linq,.net-core,azure-cosmosdb,Performance,Linq,.net Core,Azure Cosmosdb,我正在运行dotnetcore并访问documentdb 当我尝试使用linq where子句运行查询时,它会返回,但这需要很长时间,而且似乎无法在服务器上进行筛选。我可以通过使用SqlQuerySpec来运行查询来解决这个问题,现在它似乎可以在服务器上运行查询条件 Uri documentCollectionUri = UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId); var query = client.Cre
Uri documentCollectionUri = UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId);
var query = client.CreateDocumentQuery<T>(documentCollectionUri)
.Where(predicate)
.AsDocumentQuery();
List<T> results = new List<T>();
while (documentQuery.HasMoreResults)
{
results.AddRange(await documentQuery.ExecuteNextAsync<T>());
}
return results;
这是一个已知的问题还是我遗漏了什么
不起作用的:
var query = _client.CreateDocumentQuery<T>(documentCollection.DocumentsLink).Where(criteria);
return query.ToList();
var documentQuery = _client.CreateDocumentQuery<T>(UriFactory.CreateDocumentCollectionUri(_databaseName, collectionName), query).AsDocumentQuery();
List<T> results = new List<T>();
while (documentQuery.HasMoreResults)
{
results.AddRange(await documentQuery.ExecuteNextAsync<T>());
}
return results;
这是dotnet core实现documentdb sdk与标准.NET包相比所落后的功能吗
当我尝试使用linq where子句运行查询时,它会返回,但这需要很长时间,而且似乎无法在服务器上进行筛选
Uri documentCollectionUri = UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId);
var query = client.CreateDocumentQuery<T>(documentCollectionUri)
.Where(predicate)
.AsDocumentQuery();
List<T> results = new List<T>();
while (documentQuery.HasMoreResults)
{
results.AddRange(await documentQuery.ExecuteNextAsync<T>());
}
return results;
如果我们在运行var query=\u client.CreateDocumentQuery(documentCollection.DocumentsLink).Where(条件)时捕获请求代码>,我们可以找到它
获取https://{databaseaccount}.documents.azure.com/dbs/{db id}/colls/{coll id}/docs
以获取集合下的文档列表,但实际上并没有
和用于根据谓词筛选值序列,该谓词发生在客户机上(而不是将搜索条件传递给DocumentDB服务器)
当我尝试使用linq where子句运行查询时,它会返回,但这需要很长时间,而且似乎无法在服务器上进行筛选
Uri documentCollectionUri = UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId);
var query = client.CreateDocumentQuery<T>(documentCollectionUri)
.Where(predicate)
.AsDocumentQuery();
List<T> results = new List<T>();
while (documentQuery.HasMoreResults)
{
results.AddRange(await documentQuery.ExecuteNextAsync<T>());
}
return results;
如果我们在运行var query=\u client.CreateDocumentQuery(documentCollection.DocumentsLink).Where(条件)时捕获请求代码>,我们可以找到它
获取https://{databaseaccount}.documents.azure.com/dbs/{db id}/colls/{coll id}/docs
以获取集合下的文档列表,但实际上并没有
和用于根据谓词筛选值序列,该谓词发生在客户端上(不会将搜索条件传递给DocumentDB server)。问题在于您使用的是Func
作为条件。您正在使用的是用于IEnumerable
。通过设计IEnumerable
将进行内存过滤(客户端)
CreateDocumentQuery.Where()
实际上返回一个IQueryable
。您需要将条件类型更改为Expression
,因为这是CreateDocumentQuery
所期望的
使用表达式时,LINQ表达式将转换为特定于数据库的SQL查询,并将在服务器上执行
Uri documentCollectionUri = UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId);
var query = client.CreateDocumentQuery<T>(documentCollectionUri)
.Where(predicate)
.AsDocumentQuery();
List<T> results = new List<T>();
while (documentQuery.HasMoreResults)
{
results.AddRange(await documentQuery.ExecuteNextAsync<T>());
}
return results;
uridocumentcollectionuri=UriFactory.CreateDocumentCollectionUri(DatabaseId,CollectionId);
var query=client.CreateDocumentQuery(documentCollectionUri)
.Where(谓词)
.AsDocumentQuery();
列表结果=新列表();
while(documentQuery.HasMoreResults)
{
AddRange(wait documentQuery.ExecuteNextAsync());
}
返回结果;
其中谓词
是表达式
要记住一件重要的事情:您只能使用那些在DocumentDb的SQL语言中具有等效函数的LINQ扩展。例如,您可以使用Take()
,但不能使用Skip()
,也不能在特定的嵌套字段上使用Array contains等。问题在于您使用的是Func
作为标准。您正在使用的是用于IEnumerable
。通过设计IEnumerable
将进行内存过滤(客户端)
CreateDocumentQuery.Where()
实际上返回一个IQueryable
。您需要将条件类型更改为Expression
,因为这是CreateDocumentQuery
所期望的
使用表达式时,LINQ表达式将转换为特定于数据库的SQL查询,并将在服务器上执行
Uri documentCollectionUri = UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId);
var query = client.CreateDocumentQuery<T>(documentCollectionUri)
.Where(predicate)
.AsDocumentQuery();
List<T> results = new List<T>();
while (documentQuery.HasMoreResults)
{
results.AddRange(await documentQuery.ExecuteNextAsync<T>());
}
return results;
uridocumentcollectionuri=UriFactory.CreateDocumentCollectionUri(DatabaseId,CollectionId);
var query=client.CreateDocumentQuery(documentCollectionUri)
.Where(谓词)
.AsDocumentQuery();
列表结果=新列表();
while(documentQuery.HasMoreResults)
{
AddRange(wait documentQuery.ExecuteNextAsync());
}
返回结果;
其中谓词
是表达式
要记住一件重要的事情:您只能使用那些在DocumentDb的SQL语言中具有等效函数的LINQ扩展。例如,您可以使用Take()
,但不能使用Skip()
,不能在特定的嵌套字段上使用数组包含,等等