【问题标题】:dotnet core azure documentdb linq lambda query not running query on serverdotnet core azure documentdb linq lambda 查询未在服务器上运行查询
【发布时间】:2017-08-31 17:44:54
【问题描述】:

我正在运行 dotnet core 并访问 documentdb。

当我尝试使用 linq where 子句运行查询时,它会返回,但它需要很长时间并且似乎没有在服务器上进行过滤。我能够通过使用 SqlQuerySpec 运行查询来解决此问题,现在它似乎在服务器上运行查询条件。

这是一个已知问题还是我遗漏了什么?

不起作用的那个:

var query = _client.CreateDocumentQuery<T>(documentCollection.DocumentsLink).Where(criteria);    
return query.ToList();

条件属于类型

Func<T, bool> criteria

有效的方法:

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;

查询的类型

SqlQuerySpec query

这是 dotnet core 实现 documentdb sdk 与标准 .NET 包相比落后的功能吗?

【问题讨论】:

    标签: performance linq .net-core azure-cosmosdb


    【解决方案1】:

    问题是您使用Func&lt;T, bool&gt; 作为标准。您正在使用的是IEnumerable。按照设计IEnumerable 将进行内存过滤(客户端)。

    CreateDocumentQuery.Where() 实际上返回一个IQueryable。您需要将您的标准类型更改为Expression&lt;Func&lt;T, bool&gt;&gt;,因为这是CreateDocumentQuery 所期望的。

    当您使用Expression 时,您的 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;
    

    predicateExpression&lt;Func&lt;T, bool&gt;&gt;

    要记住一件重要的事情:您只能使用在 DocumentDb 的 SQL 语言中具有等效功能的那些 LINQ 扩展。例如,你可以使用Take(),但你不能使用Skip(),你不能在特定的嵌套字段上使用Array contains等。

    【讨论】:

      【解决方案2】:

      当我尝试使用 linq where 子句运行查询时,它会返回,但它需要很长时间并且似乎没有在服务器上进行过滤。

      如果我们在运行var query = _client.CreateDocumentQuery&lt;T&gt;(documentCollection.DocumentsLink).Where(criteria);时捕获请求,我们可以找到它performs a GET on the documents resource of a particular collection

      GET https://{databaseaccount}.documents.azure.com/dbs/{db-id}/colls/{coll-id}/docs获取集合下的文档列表,其实不是query and filter on DocumentDB server

      Where method 用于根据谓词过滤一系列值,这发生在客户端(不将搜索条件传递给 DocumentDB 服务器)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-09
        • 1970-01-01
        • 2018-07-26
        • 1970-01-01
        • 2020-06-14
        • 1970-01-01
        • 2017-08-11
        • 1970-01-01
        相关资源
        最近更新 更多