Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance dotnet core azure documentdb linq lambda查询未在服务器上运行查询_Performance_Linq_.net Core_Azure Cosmosdb - Fatal编程技术网

Performance dotnet core azure documentdb linq lambda查询未在服务器上运行查询

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

我正在运行dotnetcore并访问documentdb

当我尝试使用linq where子句运行查询时,它会返回,但这需要很长时间,而且似乎无法在服务器上进行筛选。我可以通过使用SqlQuerySpec来运行查询来解决这个问题,现在它似乎可以在服务器上运行查询条件

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()
,不能在特定的嵌套字段上使用数组包含,等等