首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在LINQ to Entities中,如何像下面这样排序?

在LINQ to Entities中,如何像下面这样排序?
EN

Stack Overflow用户
提问于 2018-02-12 14:51:20
回答 4查看 344关注 0票数 4

我有一个可查询的实体,上面有一个"Code“字段

代码语言:javascript
运行
复制
1.1.1,
1.1.2,
1.1.3,
1.1.4,
...,
1.1.10,
1.1.11

不幸的是,当我对查询执行.OrderBy(x=> x.Code)时,它按以下顺序返回

代码语言:javascript
运行
复制
1.1.1,
1.1.10,
1.1.11,
1.1.2,
1.1.3,
...

如何才能使对象列表按代码字段排序,由“.”分割,并在每个部分之间作为一个整数?

这是客户数据,所以我不能把"0“放在数字1的前面。它也是此代码字段中的任意数量的“.”。

如果您需要进一步的信息,请让我知道。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-02-12 17:01:59

如果你能做一些假设,比如每个节点最多可以有n个字母。您可以使用此代码。

代码语言:javascript
运行
复制
.OrderBy(x => String.Concat( x.Code.Split('.')
                                   .Select(ss => ss.PadLeft(3, '0'))) )
票数 5
EN

Stack Overflow用户

发布于 2018-02-12 14:53:53

Version类应该是一个很好的方法。不幸的是,Version.Parse在Linq2Entity上失败了,因此您必须首先从您的sql服务器获取数据,然后对其进行排序。

代码语言:javascript
运行
复制
var result = input.AsEnumerable<string>().OrderBy(x => Version.Parse(x.Code));
票数 5
EN

Stack Overflow用户

发布于 2018-02-12 16:11:08

如果您的表中有大量数据,那么您就不能真正使用建议的解决方案,这些解决方案需要从服务器提取所有数据,然后在客户端进行排序。要在服务器上做到这一点,并且仍然使用Entity Framework,您需要创建SQL函数或可计算列并按此进行排序,除非您知道如何仅使用Entity Framework可转换为SQL的函数将代码转换为可排序的形式。如果您使用的是SQL Server,则SQL函数示例如下:

代码语言:javascript
运行
复制
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版本,是代码优先还是数据库优先),并按此排序:

代码语言:javascript
运行
复制
ctx.Entities.OrderBy(c => ctx.DotSeparatedSort(c.Code))

它将被翻译成select * from Entities order by dbo.DotSeparatedSort(Code)。在计算列的情况下,显然只需按此进行排序。

如果你使用计算列-你可以在它上面定义索引,所以如果你有大量的数据-我更喜欢计算列,因为这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48740934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档