You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 04:57:13