基于引用记录的自定义排序
Custom Sort Based On Referenced Records
请考虑这些数据:
Id F1 F2 Ref_ID
-------------------------------------------
1 Nima 35 Null
2 Eli 33 Null
3 Arian 5 1
4 Ava 1 1
5 Arsha 3 2
6 Rozhan 30 1
7 Zhina 20 2
我想对 table 这样的结果进行排序:
Id F1 F2 Ref_ID
-------------------------------------------
1 Nima 35 Null
3 Arian 5 1
4 Ava 1 1
6 Rozhan 30 1
2 Eli 33 Null
5 Arsha 3 2
7 Zhina 20 2
被引用的记录按照Id从小到大放在引用记录下
我如何使用 LINQ
或 SQL
来做到这一点。谢谢
在 SQL 中,您可以使用 COALESCE
或 ISNULL
对 Ref_id 和 ID 进行排序。
和 IIF
或 CASE WHEN
以确保父 ID 在同一组 Ref_id 中排在第一位。
SELECT Id, F1, F2, Ref_ID
FROM YourTable
ORDER BY COALESCE(Ref_ID, Id), IIF(Ref_ID IS NULL, 0, 1), Id;
对 db<>fiddle here
的测试
这是一个更简单的解决方案:
SELECT
Id,
F1,
F2,
Ref_ID
FROM
@Table
ORDER BY
ISNULL(Ref_ID,ID), ID
结果:
另一个解决方案是在查询中添加一个额外的列,然后对该列进行排序
select t.*
from ( select Id,
F1,
F2,
Ref_ID,
coalesce(Ref_ID, Id) as RefID_or_Id,
iif(Ref_ID is null, 0, 1) as Ref_ID_0_or_1
from YourTable
) t
order by t.RefID_or_Id,
t.Ref_ID_0_or_1,
t.Id
如果您的 table 很大,您应该测试这里的解决方案中哪一个最适合您
使用 LINQ,您可以这样做:
from i in data
orderby i.Ref_ID ?? i.Id
select i;
请考虑这些数据:
Id F1 F2 Ref_ID
-------------------------------------------
1 Nima 35 Null
2 Eli 33 Null
3 Arian 5 1
4 Ava 1 1
5 Arsha 3 2
6 Rozhan 30 1
7 Zhina 20 2
我想对 table 这样的结果进行排序:
Id F1 F2 Ref_ID
-------------------------------------------
1 Nima 35 Null
3 Arian 5 1
4 Ava 1 1
6 Rozhan 30 1
2 Eli 33 Null
5 Arsha 3 2
7 Zhina 20 2
被引用的记录按照Id从小到大放在引用记录下
我如何使用 LINQ
或 SQL
来做到这一点。谢谢
在 SQL 中,您可以使用 COALESCE
或 ISNULL
对 Ref_id 和 ID 进行排序。
和 IIF
或 CASE WHEN
以确保父 ID 在同一组 Ref_id 中排在第一位。
SELECT Id, F1, F2, Ref_ID
FROM YourTable
ORDER BY COALESCE(Ref_ID, Id), IIF(Ref_ID IS NULL, 0, 1), Id;
对 db<>fiddle here
的测试这是一个更简单的解决方案:
SELECT
Id,
F1,
F2,
Ref_ID
FROM
@Table
ORDER BY
ISNULL(Ref_ID,ID), ID
结果:
另一个解决方案是在查询中添加一个额外的列,然后对该列进行排序
select t.*
from ( select Id,
F1,
F2,
Ref_ID,
coalesce(Ref_ID, Id) as RefID_or_Id,
iif(Ref_ID is null, 0, 1) as Ref_ID_0_or_1
from YourTable
) t
order by t.RefID_or_Id,
t.Ref_ID_0_or_1,
t.Id
如果您的 table 很大,您应该测试这里的解决方案中哪一个最适合您
使用 LINQ,您可以这样做:
from i in data
orderby i.Ref_ID ?? i.Id
select i;