我有一个客户端应用程序,在那里我创建模型并在本地存储,还将映射的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;
   }

有没有更好的过滤方法?若要 Select 可更新文档,请执行以下操作?而不是linqFeed和SingleOrDefault?

推荐答案

看起来没什么问题.您可以通过只 Select 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();
}

Csharp相关问答推荐

获取ASP.NET核心身份认证cookie名称

Microsoft. SQLServer. Types(106.1000.6)在try 从用户定义的类型检索值时引发异常

迭代C#List并在数据库中 for each 元素执行SELECT语句—更有效的方式?

在C#WinUI中,一个关于System的崩溃."由于未知原因导致执行不例外"

为什么在ANTLR4中会出现不匹配的输入错误?""

此反射有什么问题.是否发送值转换委托?

WPF DataGrid中的三维数据

将轮询与超时同步

在具有不同属性名称的两个类之间创建关系

异步实体框架核心查询引发InvalidOperation异常

什么时候接受(等待)信号灯?尽可能的本地化?

VS 2022 for ASP.NET Core中缺少自定义项模板

如何对特定异常使用Polly重试机制?

如何从SignalR获取连接客户端的域

正在try 将自定义字体添加到我的控制台应用程序

DropDownListFor未显示选定值

SharpZipLib在文件名前加上目录名,生成tar.gz

外部应用&&的LINQ;左外部连接&类似于PostgreSQL的查询

同时通过多个IEumable<;T&>枚举

C#:我需要根据换行符拆分字符串,而不是在字符串中用双引号分隔换行符