Linq 查询在 ASP.NET-Core 3.0 及更高版本中对数字等字符串进行排序
Posted
技术标签:
【中文标题】Linq 查询在 ASP.NET-Core 3.0 及更高版本中对数字等字符串进行排序【英文标题】:Linq query to sort strings like numbers in ASP.NET-Core 3.0 and above 【发布时间】:2021-10-31 05:37:51 【问题描述】:我最近从 ASP.NET-Core 2.2 升级到 ASP.NET-Core 3.1。我的数量是字符串(大多数只是数字,但我们有一些是 100 英尺、1 个线轴等)。在 2.2 中,我可以使用 PadLeft 对它们进行排序,但这会在 ASP.NET-Core3 中引发错误。 0 及以上。有谁知道使用 LINQ 查询对字符串进行排序的好方法? (所以你不会得到“999”,然后是“99”,然后是“888”,“88”等......)
我的旧解决方案是:
IQueryable<InventoryItem> Items;
Items = from m in _context.Inventory.Where(m => m.Removed == 0)
select m;
case "Quantity":
Items = Items.OrderByDescending(s => s.Quantity.PadLeft(maxlen, '0'));
break;
这不再有效,因为 ASP.NET-Core 3.1 在服务器而不是客户端评估它。看不懂.PadLeft()
补充:我正在分页,所以查询运行在这一行:
items = await source.Skip(
(pageIndex - 1) * pageSize)
.Take(pageSize).ToListAsync();
如果我在那之前去 toList,我不会将查询的结果限制为选择的结果数...
【问题讨论】:
你能用minimal reproducible exampleedit你的帖子吗? 如果没有Skip/Take 限制查询结果,只需在OrderBy
前添加AsEnumerable
即可,与EF Core 2.2 相同。
我添加了类型和初始查询。
稍后有分页...我想我只需要等待在所有其他延迟查询结束时返回列表后进行排序。因此,这是对我的代码进行重新排序并对列表进行排序,而不是通过查询进行排序。除非有一个我可以在进入 toList 之前使用的解决方案..
实际上,正如 Serge 向我指出的那样,这行不通。页面顺序由排序决定...回到绘图板。
【参考方案1】:
您有一个错误,因为 Linq 无法将您的代码转换为 Sql 查询。因此,您必须首先使用 ToList(或 ToArray)从 db 下载数据。在此之后,您可以使用任何类型的算法对列表进行排序。
Items = _context.Inventory.Where(m => m.Removed == 0).ToList();
Items = items.OrderByDescending(s => s.Quantity.PadLeft(maxlen,'0'));
【讨论】:
类型问题。 (不想从 IQueryAble 转换为 IEnumerable)我将类型添加到 OP。 @pcalkins 我不知道这个,只是不要使用上下文,看看我的更新答案。 我开始认为我应该初始化为 IEnumerable... 不确定这样做的后果。我认为他们都使用延迟查询? @pcalkins ToLIst 是 AsEnumerable。 @pcalkins 5 之前的版本如果他们不能转换为 sq 自动选择从 Db 到 Web 服务器的所有记录,然后对其进行排序很多人没有意识到这一点,并认为一切都很好.现在 ef5+ 如果不能转换为 sql 会报错。【参考方案2】:尝试这样做。 Convert.ToInt32 会自动从 EF 转换为查询。
Items = Items.OrderByDescending(s => Conert.ToInt32(s.Quantity));
【讨论】:
当它找到一个非数字时它会出错......通常我会尝试解析这些调用,但不认为你可以在这里做到吗?它会转换为布尔值...不确定我是否可以将所有 if/then 逻辑放在那里。 Tryparse 在 SQL 查询中不转换。对不起,我认为你只有数字.... 在这个答案中你可以找到一些帮助。 ***.com/a/35450462/15714806以上是关于Linq 查询在 ASP.NET-Core 3.0 及更高版本中对数字等字符串进行排序的主要内容,如果未能解决你的问题,请参考以下文章
C#3.0中的新增功能09 LINQ 04 基本 LINQ 查询操作
从类库访问 Asp.net-core 中的 appsetting.json