如何解决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来解决此问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。