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

注册通用工厂的C# Dep注入

将修剪声明放入LINQ中

CS0103 dlibdotnet和www.example.com facerect不在上下文中

一种安全的方式来存储SSH凭证(MAUI/C#应用程序)

为什么Blazor值在更改后没有立即呈现?

.NET 8 Web-API返回空列表

ASP.NET核心MVC SqlException:违反主键约束';PK_USER';.无法在对象';数据库中插入重复的密钥.用户';

C#使用TextFieldParser读取.csv,但无法使用";0";替换创建的列表空条目

为什么AggregateException的Catch块不足以处理取消?

BFF到具有AAD/Entra ID B2C的内部API(.NET/ASP.NET核心/标识.Web)

WPF DataGrid文件名列,允许直接输入文本或通过对话框按键浏览

MudBlazor Textfield已禁用,但其验证工作正常

当我try 在与XAMP的MySQL服务器连接的ASP.NET核心应用程序中添加迁移时出现错误

未显示详细信息的弹出对话框

Xamarin.Forms中具有类似AspectFill的图像zoom 的水平滚动视图

使用免费的DotNet库从Azure函数向Azure文件共享上的现有Excel文件追加行

最小API定义的Swagger标头参数

单位中快照的倾斜方向

我如何为我的Blazor应用程序构建一个动态教程标注?

在SQL中删除少于24小时的令牌