有没有更好的方法通过 not id 在 CosmosDB 上更新插入?

问题描述 投票:0回答:1

我有一个客户端应用程序,我可以在其中创建模型并在本地存储,并将映射的 DTO 发送到 Web api。

class TestModel // Locally stored model
    {
       Guid OwnerId;
       Guid LocalId;
       string Name;
    }

class TestDto // Remotely stored model 
    {
       Guid Id;
       Guid OwnerId;
       Guid LocalId;
       string Name;
    }

在服务器端: 当我将映射的 DTO 发送到 Web Api 时,我想更新,但因为模型不知道数据库存储的 DTO 的 ID,所以我使用 OwnerId 和 LocalId 来检测要更新的存储的 DTO。

   public async Task<TestDto?> UpdateAsync(TestDto testDto)
   {
       IOrderedQueryable<TestDto> queryable = _container.GetItemLinqQueryable<TestDto>();

       // Construct LINQ query
       var matches = queryable.Where(p => p.LocalId == testDto.LocalId && p.OwnerId == testDto.OwnerId);

       using FeedIterator<TestDto> linqFeed = matches.ToFeedIterator();

       List<TestDto> results = new List<TestDto>();
       while (linqFeed.HasMoreResults)
       {
           var response = await linqFeed.ReadNextAsync();
           results.AddRange((IEnumerable<TestDto>)response);
       }

       var result = results.SingleOrDefault();

       if (result != null && results.Count == 1)
       {
           testDto.Id = result.Id; // need set to update
           await _container.UpsertItemAsync<TestDto>(testDto, new PartitionKey(testDto.OwnerId.ToString()));
       }

       return result;
   }

有没有更好的过滤方法?选择可更新的文档?而不是 linqFeed 和 singleOrDefault?

c# azure-cosmosdb
1个回答
0
投票

看起来大部分都很好。您可以通过仅选择

Id
属性来提高性能,而不是返回所有结果,只返回第一个结果。即使您只期望一个结果,查询也将始终扫描所有项目,而不是在找到任何项目后返回。

您需要以某种方式检索

Id
,因此除非您有随时可用的
Id
,否则您将始终在某处运行查询。除了稍微清理代码以提高可读性之外,没有太多需要改进的地方。

using var iterator = container
    .GetItemLinqQueryable<TestDto>()
    .Where(p => p.LocalId == testDto.LocalId && p.OwnerId == testDto.OwnerId)
    .Take(1)
    .Select(p => p.Id)
    .ToFeedIterator();

Guid Id;
while (iterator.HasMoreResults)
{
    var feed = await iterator.ReadNextAsync();
    Id = feed.FirstOrDefault();
}
© www.soinside.com 2019 - 2024. All rights reserved.