Код: Выделить всё
private async Task GetDataAsync(int Id, string cacheKey, CancellationToken cancellationToken)
{
var results = _cacheProvider.Get(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;
}
Проблема: я ожидаю, что FrozenSet будет управлять или сохранять порядок элементов, извлекаемых из базы данных с помощью идентификатора orderby. Однако FrozenSet, похоже, не сохраняет порядок вставки, что не является предполагаемым поведением для наборов в целом.
Это ожидаемое поведение FrozenSet в определенных обстоятельствах или может ли оно быть таковым? зависит от того, как данные вставляются или извлекаются? Существуют ли какие-либо известные проблемы или особенности FrozenSet в C#, которые могут привести к такому поведению? Каковы наилучшие методы обеспечения того, чтобы коллекция не управляла и не сохраняла порядок при кэшировании объектов данных?
Я сделал еще один образец POC с помощью следующего кода и обнаружил, какой порядок он поддерживает. Не знаю, почему код, возвращающий данные из базы данных, не поддерживает порядок при преобразовании их в FrozenSet.
Рабочий пример:
Код: Выделить всё
public async Task GetDataAsync(CancellationToken cancellationToken)
{
List lstitem = new List();
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 frozenSet = lstitem.ToFrozenSet();
return frozenSet;
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... ethod-usin