我有一个客户端应用程序,我可以在其中创建模型并在本地存储,并将映射的 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?
看起来大部分都很好。您可以通过仅选择
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();
}