Проблема с сохранением порядка FrozenSet в асинхронном методе получения данных с использованием .NET 8.C#

Место общения программистов C#
Anonymous
Проблема с сохранением порядка FrozenSet в асинхронном методе получения данных с использованием .NET 8.

Сообщение Anonymous »

В настоящее время я столкнулся с проблемой FrozenSet в C# с веб-API .NET 8, из-за которой он неожиданно управляет порядком данных. Ниже приведен метод, при котором я сталкиваюсь с таким поведением:

Код: Выделить всё

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;
}
Предполагается, что этот метод асинхронно извлекает данные из контекста базы данных, сопоставляет их с объектом DemoDataRes и сохраняет в кеше. Если кеш пуст, он извлекает данные из базы данных, упорядочивает их по идентификатору, а затем преобразует этот список в FrozenSet перед его кэшированием.
Проблема: я ожидаю, что 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

Вернуться в «C#»