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 及更高版本中对数字等字符串进行排序的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net-Core 中的自定义身份验证

C#3.0中的新增功能09 LINQ 04 基本 LINQ 查询操作

c#3.0的Linq查询表达式特性

从类库访问 Asp.net-core 中的 appsetting.json

SqlException:INSERT 语句与 FOREIGN KEY 约束冲突 - asp.net-core

为啥 ASP.NET-Core 应用程序会收到错误消息“此平台不支持锁定/解锁文件区域”。在 MacOS 上部署时?