如何对列表中NumeroTaxas列进行OrderBy排序?排序失效求助
解决TaxaBandeiraAdministratoras列表按NumeroTaxas排序的问题
嘿,我懂你现在的困扰——想把TaxaBandeiraAdministratoras列表按NumeroTaxas从1到12排序,但操作后没生效对吧?咱们来一步步搞定这个问题。
首先看你给出的代码片段,是获取单个BandeiraAdministradora的方法。我猜你是在加载这个实体时关联加载了TaxaBandeiraAdministratoras集合,但没对这个集合做排序处理?下面给你几种可行的解决方案:
方案1:在数据库查询阶段直接排序(推荐,性能更优)
如果你的项目用的是EF Core 5及以上版本,可以直接在Include的时候对关联集合排序,排序逻辑会推送到数据库执行,效率更高:
public BandeiraAdministradora ObterPorId(Guid id, bool readOnly) { var query = Db.BandeiraAdministradora.AsQueryable(); if (readOnly) { query = query.AsNoTracking(); } return query // 直接在Include里对Taxa集合按NumeroTaxas升序排序 .Include(b => b.TaxaBandeiraAdministratoras.OrderBy(t => t.NumeroTaxas)) .FirstOrDefault(b => b.Id == id); }
如果是EF Core 5以下版本,或者你需要更灵活的属性映射,可以用Select手动投影并排序:
public BandeiraAdministradora ObterPorId(Guid id, bool readOnly) { var query = Db.BandeiraAdministradora.AsQueryable(); if (readOnly) { query = query.AsNoTracking(); } return query .Where(b => b.Id == id) .Select(b => new BandeiraAdministradora { // 映射BandeiraAdministradora的所有必要属性 Id = b.Id, Nome = b.Nome, // ...其他属性按需添加 // 对Taxa集合排序后赋值 TaxaBandeiraAdministratoras = b.TaxaBandeiraAdministratoras.OrderBy(t => t.NumeroTaxas).ToList() }) .FirstOrDefault(); }
方案2:在内存中对已加载的集合排序
如果你已经把数据加载到内存里(比如已经获取到了bandeiraAdministradora对象),可以直接在内存中排序:
// 假设你已经获取到了目标BandeiraAdministradora实例 bandeiraAdministradora.TaxaBandeiraAdministratoras = bandeiraAdministradora.TaxaBandeiraAdministratoras .OrderBy(t => t.NumeroTaxas) .ToList();
关键排查点:字段类型问题
如果上面的方法还是没生效,一定要检查NumeroTaxas的字段类型:
- 如果它是字符串类型(比如数据库里的
varchar),直接排序会出现"10"排在"2"前面的问题,这时候需要先转换成数字再排序:// 数据库查询时转换 .OrderBy(t => Convert.ToInt32(t.NumeroTaxas)) // 内存中转换 .OrderBy(t => int.Parse(t.NumeroTaxas)) - 如果是数字类型(
int/decimal等),直接用OrderBy(t => t.NumeroTaxas)就没问题。
内容的提问来源于stack exchange,提问作者Geovanna Monteiro Scabio
相关产品推荐
相关产品推荐

