LINQ查询后IQueryable返回空结果

问题描述

我正在使用Microsoft.Azure.Documents.IDocumentClient接口通过CreateDocumentQuery方法访问CosmosDB文档。

当我运行代码时不包含任何linq查询时,我得到的所有文档都没有问题:

client.CreateDocumentQuery<MyDatabaseClass>(CollectionUri,options)
      .ToList()

我想获取文档的ID,所以我尝试以下代码

client.CreateDocumentQuery<MyDatabaseClass>(CollectionUri,options)
      .Select(doc => doc.Id)
      .ToList()

这将返回0个结果。

如果我在执行查询之前将其切换并枚举IQueryable,它会很好地工作,但是据我了解(尽管我很有可能不这样做),这会降低性能

client.CreateDocumentQuery<MyDatabaseClass>(CollectionUri,options)
      .ToList()
      .Select(doc => doc.Id)

有人知道我在使用可查询项时在做什么吗? (请注意,以上是我实际尝试实现的简化版本,但是即使在此级别,问题仍然存在。)

数据库项目模式:

{
  "type": "","view": {
    "date": "","paths": {}
  },"id": "","viewId": ""
  "version": "","_rid": "","_self": "","_etag": "","_attachments": "","_ts": ""
}

班级:

public string Id{ get; private set; }

public string ViewId { get; private set; }

public string Version { get; private set; }

public abstract string Type { get; }

解决方法

如果您不特别依赖LINQ构建查询,请考虑使用.NET SDK中的QueryDefinition类以SQL语法定义要在Cosmos中运行的查询。理想情况下,任何过滤或整形都是由查询完成的,而不是在结果代码内进行。

请参阅this sample作为一个好的起点。仅选择ID:

QueryDefinition query = new QueryDefinition("select c.id from c");

// Provide query to container.GetItemQueryIterator<MyDatabaseClass>()
,

我可以使用进行SQL查询的CreateDocumentQuery overload 而不是LINQ来解决此问题。