基于引用记录的自定义排序

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从小到大放在引用记录下

我如何使用 LINQSQL 来做到这一点。谢谢

在 SQL 中,您可以使用 COALESCEISNULL 对 Ref_id 和 ID 进行排序。

IIFCASE 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;