我有一个可查询的实体,上面有一个"Code“字段
1.1.1,
1.1.2,
1.1.3,
1.1.4,
...,
1.1.10,
1.1.11不幸的是,当我对查询执行.OrderBy(x=> x.Code)时,它按以下顺序返回
1.1.1,
1.1.10,
1.1.11,
1.1.2,
1.1.3,
...如何才能使对象列表按代码字段排序,由“.”分割,并在每个部分之间作为一个整数?
这是客户数据,所以我不能把"0“放在数字1的前面。它也是此代码字段中的任意数量的“.”。
如果您需要进一步的信息,请让我知道。
发布于 2018-02-12 17:01:59
如果你能做一些假设,比如每个节点最多可以有n个字母。您可以使用此代码。
.OrderBy(x => String.Concat( x.Code.Split('.')
.Select(ss => ss.PadLeft(3, '0'))) )发布于 2018-02-12 14:53:53
Version类应该是一个很好的方法。不幸的是,Version.Parse在Linq2Entity上失败了,因此您必须首先从您的sql服务器获取数据,然后对其进行排序。
var result = input.AsEnumerable<string>().OrderBy(x => Version.Parse(x.Code));发布于 2018-02-12 16:11:08
如果您的表中有大量数据,那么您就不能真正使用建议的解决方案,这些解决方案需要从服务器提取所有数据,然后在客户端进行排序。要在服务器上做到这一点,并且仍然使用Entity Framework,您需要创建SQL函数或可计算列并按此进行排序,除非您知道如何仅使用Entity Framework可转换为SQL的函数将代码转换为可排序的形式。如果您使用的是SQL Server,则SQL函数示例如下:
CREATE FUNCTION dbo.DotSeparatedSort(@input varchar(max))
RETURNS hierarchyid
AS
BEGIN
return CAST(N'/' + replace(@input, '.', '/') + N'/' AS hierarchyid)
END它会将点分隔的数字转换为hierarchyid类型,该类型具有您需要的排序语义。
对计算列也可以这样做(只需将CAST(N'/' + replace(Code, '.', '/') + N'/' AS hierarchyid)作为公式)。
然后你需要将函数导入EF模型(细节取决于你使用的EF版本,是代码优先还是数据库优先),并按此排序:
ctx.Entities.OrderBy(c => ctx.DotSeparatedSort(c.Code))它将被翻译成select * from Entities order by dbo.DotSeparatedSort(Code)。在计算列的情况下,显然只需按此进行排序。
如果你使用计算列-你可以在它上面定义索引,所以如果你有大量的数据-我更喜欢计算列,因为这一点。
https://stackoverflow.com/questions/48740934
复制相似问题