C# 如何查询特定类型,然后获取基础文档
我要做的是按特定文档类型进行查询C# 如何查询特定类型,然后获取基础文档,c#,linq,azure,azure-cosmosdb,document-database,C#,Linq,Azure,Azure Cosmosdb,Document Database,我要做的是按特定文档类型进行查询 MyType foo = client.CreateDocumentQuery<MyType>(documentCollectionUri) .ToList() .FirstOrDefault(d => d.SomeProperty == someProperty); MyType foo=client.CreateDocumentQuery(documentCollectionUri) 托利斯先生() .FirstOrDefau
MyType foo = client.CreateDocumentQuery<MyType>(documentCollectionUri)
.ToList()
.FirstOrDefault(d => d.SomeProperty == someProperty);
MyType foo=client.CreateDocumentQuery(documentCollectionUri)
托利斯先生()
.FirstOrDefault(d=>d.SomeProperty==SomeProperty);
然后用另一个文档替换该文档。看起来唯一可用的方法是
public Task<ResourceResponse<Document>> ReplaceDocumentAsync(Uri documentUri, object document, RequestOptions options = null);
public Task<ResourceResponse<Document>> ReplaceDocumentAsync(Document document, RequestOptions options = null);
public Task<ResourceResponse<Document>> ReplaceDocumentAsync(string documentLink, object document, RequestOptions options = null);
public Task replacedocumentsync(Uri-documentUri,object-document,RequestOptions-options=null);
公共任务replacedocumentsync(文档,RequestOptions=null);
公共任务replacedocumentsync(字符串documentLink,对象文档,RequestOptions=null);
所有这些都需要文档
或其id
那么,如何从
foo
获取这些值呢?不可能?首先,您应该像这样进行查询:
List<MyType> foo = client.CreateDocumentQuery<MyType>(documentCollectionUri)
.Where(d => d.SomeProperty == someProperty);
.ToList();
首先也是最重要的是,你表达问题的方式不太清楚
MyType foo = client.CreateDocumentQuery<MyType>(documentCollectionUri)
.ToList()
.FirstOrDefault(d => d.SomeProperty == someProperty);
MyType foo=client.CreateDocumentQuery(documentCollectionUri)
托利斯先生()
.FirstOrDefault(d=>d.SomeProperty==SomeProperty);
如果在同一个问题中存储多个不同类型的对象,则使用T
参数MyType
不能保证您将得到的结果只会是MyType
结果,而是匹配表达式的任何内容都将被映射并作为MyType
返回。CosmosDB SDK中没有其他过滤可以保证查询只发生在该类型的对象上,因为CosmosDB没有该类型的上下文
使用replacedocumentsync
方法可以做到这一点的唯一可靠方法是(正如Alex AIT所说)在对象上添加Id
属性和[JsonProperty(“Id”)]
属性。考虑到它是一个DTO而不是域对象,这个属性应该存在,它将真正有助于其他功能,如us delete等
我强烈建议您看看哪一个是CosmosDB ORM,它还可以处理基于类型的集合共享以及您试图实现的相同查询和更新,而不必弄乱任何此类逻辑
免责声明:我是宇航员的创造者
另一方面,您不应该在使用
CreateDocumentQuery
创建的IQueryable上使用ToList()
,而应该在其上使用.AsDocumentQuery()
方法,然后使用while(query.HasMoreResults)
和query.executeextasync()的组合
正确使用分页CosmosDB功能的方法。您当前的输入和期望的输出是什么?MyType foo看起来怎么样?这是一个错误的答案,有多种原因。首先,对于CreateDocumentQuery
,您不应该使用.ToList()
,而应该使用while has more thanExecuteNextAsync
方法来正确执行Cosmos分页。其次,仅仅使用CreateDocumentQuery
方法并不能保证t
将属于特定类型,但表达式中匹配的任何内容都将映射到该类型。为什么ToList为false?也许它没有那么有效,但如果预期的结果很少,那么它就没有问题。当然,它不能保证类型匹配,我从来没有说过会匹配。
var query = client.CreateDocumentQuery<MyType>(documentCollectionUri)
.Where(d => d.SomeProperty == someProperty)
.AsDocumentQuery();
var response = await query.ExecuteNextAsync<Document>(cancellationToken).ConfigureAwait(false);
var document = response.FirstOrDefault();
MyType foo = client.CreateDocumentQuery<MyType>(documentCollectionUri)
.ToList()
.FirstOrDefault(d => d.SomeProperty == someProperty);