.NET 8异步数据获取中FrozenSet的顺序保留异常问题
.NET 8 Web API中FrozenSet的顺序管理异常问题
我在.NET 8 Web API中使用C#的FrozenSet时遇到了顺序不保留的意外问题,以下是出现问题的方法:
private async Task<FrozenSet<DemoDataRes>> GetDataAsync(int Id, string cacheKey, CancellationToken cancellationToken) { var results = _cacheProvider.Get<FrozenSet<DemoDataRes>>(cacheKey, CacheKeys.DEMOCACHEGROUP); if (results is null) { results = (await (from avt in _DemoDbContext.Catalogs where avt.Id == Id orderby avt.Id select new DemoDataRes { Id = avt.Id, Type = avt.Name, } ).ToListAsync(cancellationToken)); var value = results.ToFrozenSet(); _cacheProvider.Set(cacheKey, value, CacheKeys.DEMOCACHEGROUP, Defaults.CacheExpiryMinutes); } return results; }
该方法逻辑为:异步从缓存获取数据,缓存为空时从数据库查询符合条件的数据并按Id排序,映射为DemoDataRes对象后转换为FrozenSet存入缓存。但实际返回的FrozenSet并未保留数据库查询时的排序顺序,不符合预期。
核心疑问
- 这是否是
FrozenSet在特定场景下的预期行为?是否受数据插入或检索方式的影响? - C#中
FrozenSet有哪些需要注意的已知问题? - 缓存数据对象时,确保集合不保留或管理顺序的最佳实践是什么?
POC测试示例
我编写了一个POC示例,以下代码中FrozenSet能够维持预期顺序,无法理解为何数据库查询转换时无法保留顺序:
public async Task<FrozenSet<DemoDataRes>> GetDataAsync(CancellationToken cancellationToken) { List<DemoDataRes> lstitem = new List<DemoDataRes>(); DemoDataRes item1 = new DemoDataRes(); item1.Type = "one"; item1.CatalogId = 100; lstitem.Add(item1); DemoDataRes item2 = new DemoDataRes(); item2.Type = "two"; item2.CatalogId = 21; lstitem.Add(item2); DemoDataRes item3 = new DemoDataRes(); item3.Type = "three"; item3.CatalogId = 34; lstitem.Add(item3); DemoDataRes item4 = new DemoDataRes(); item4.Type = "four"; item4.CatalogId = 49; lstitem.Add(item4); lstitem = await Task.FromResult(lstitem.OrderByDescending(x => x.CatalogId).ToList()); FrozenSet<FlexInspReportControlDataRes> frozenSet = lstitem.ToFrozenSet(); return frozenSet; }
内容的提问来源于stack exchange,提问作者santosh kumar patro
相关产品推荐
相关产品推荐

