【发布时间】:2022-01-19 14:13:37
【问题描述】:
我在数据库中有场景
CREATE TABLE #MyVersions
(
MyVersion VARCHAR(100) NULL
)
DELETE FROM #MyVersions
INSERT INTO #MyVersions
(MyVersion)
VALUES
(NULL),
(''),
('10001'),
('10001_2'),
('10001_3'),
('10001_4'),
('10001_6'),
('10001_9'),
('10001_11'),
('10001_5'),
('10001_7'),
('10001_8'),
('10001_10'),
('10001_12')
SELECT MyVersion
FROM #MyVersions
Order by CASE MyVersion
WHEN NULL THEN MyVersion
ELSE CAST(SUBSTRING(MyVersion,
charindex('_', MyVersion) + 1,
LEN(MyVersion)-charindex('_', MyVersion)) AS INT)
END
我想将上面的 select 语句转换为 Entity Framework LINQ 方法表达式。
实际上我想按'_'之后的整数部分对表格进行排序
有人可以帮忙吗? 谢谢
【问题讨论】:
-
你没有。修复不良设计。表字段应该存储 one 值。显然,您希望将这些值视为两个单独的字段并查询第二个字段。 LINQ 不是 SQL 的替代品,它是 ORM 的一种语言。 ORM 可以将对象映射到关系表,并且不能修复不良的数据库设计
-
你有一个有效的点。根据规范化的基本规则,该字段不是原子的。这是旧数据库,现在我们正在迁移到新系统
-
此查询无法利用任何涵盖
MyVersion的索引。除非有很多行,否则将数据加载到内存中并在客户端进行拆分和排序会更容易并且可能更快。另一种选择是使用计算列来提取该字符串的不同部分。该列可以很容易地映射到对象属性。它甚至可以被索引以提高性能。这将允许您使用ORDER BY MajorVersion, MinorVersion其中 MajorVersion 和 MinorVersion 是计算列 -
您的积分有效。我正在考虑这样做。结果中几乎没有最多二十行
-
那么,您要转换什么?
OrderBy或带有临时表的整个语句?
标签: entity-framework linq sql-to-linq-conversion