Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.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
C# 如何查询特定类型,然后获取基础文档_C#_Linq_Azure_Azure Cosmosdb_Document Database - Fatal编程技术网

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 than
ExecuteNextAsync
方法来正确执行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);