使用 Linq to SQL 的困难排序顺序

Posted

技术标签:

【中文标题】使用 Linq to SQL 的困难排序顺序【英文标题】:Difficult sort order with Linq to SQL 【发布时间】:2014-02-21 03:11:16 【问题描述】:

我有一个需要以特定方式排序的对象列表。

相关的表格字段是:

ID(整数) IsMandatory(位) ParentID(int 可为空) 代码(varchar)

我需要它们首先按 IsMandatory=true 排序,然后按 Code 排序,但是任何具有 ParentID 的内容都必须按 Code 排序,但直接出现在 ID 与 ParentID 相同的行之后(并且这些记录将始终将 IsMandatory 设置为 NULL )。

一些示例数据,这也是它们在订购时应该出现的顺序:

ID=1, IsMandatory=1, ParentID=NULL, Code="A" ID=2,IsMandatory=NULL,ParentID=1,代码="A" ID=3,IsMandatory=NULL,ParentID=1,代码="B" ID=4, IsMandatory=1, ParentID=NULL, Code="B" ID=5,IsMandatory=0,ParentID=NULL,代码="C" ID=6, IsMandatory=NULL, ParentID=5, Code="A" ID=7, IsMandatory=0, ParentID=NULL, Code="D"

如何在 Linq to SQL orderby 中最好地实现这一点?

【问题讨论】:

【参考方案1】:

这是一个困难的排序!

困难的原因源于您首先对父母记录属性进行排序,然后才是实际记录属性。

我试图使变量尽可能地自我解释,但如果您有任何问题,请提出!

  var query = from x in context.Table
              let parent = list.FirstOrDefault(y => x.ParentID == y.ID)
              let parentIsMandatory = parent == null ? x.IsMandatory : parent.IsMandatory
              let parentIsMandatoryOrder = parentIsMandatory == true ? 0 : 1
              let parentCode = parent == null ? x.Code : parent.Code
              let parentId = x.ParentID ?? x.ID
              let isParent = x.ParentID == null ? 0 : 1
              orderby parentIsMandatoryOrder, parentCode, parentId, isParent, x.Code
              select x;

【讨论】:

以上是关于使用 Linq to SQL 的困难排序顺序的主要内容,如果未能解决你的问题,请参考以下文章

Linq to SQL - 如何将数字作为字符串排序?

LINQ to Entities中数据分页时,必须要OrderBy吗

LINQ 常规实践

LINQ to Entities 查询注意事项

LINQ to Entities 查询注意事项

LINQ to Entities 查询注意事项