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

时间:2014-02-21 03:11:17

标签: linq linq-to-sql

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

相关的表格字段为:

  • ID(int)
  • IsMandatory(位)
  • ParentID(int nullable)
  • 代码(varchar)

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

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

  • ID = 1,IsMandatory = 1,ParentID = NULL,Code =“A”
  • ID = 2,IsMandatory = NULL,ParentID = 1,Code =“A”
  • ID = 3,IsMandatory = NULL,ParentID = 1,Code =“B”
  • ID = 4,IsMandatory = 1,ParentID = NULL,Code =“B”
  • ID = 5,IsMandatory = 0,ParentID = NULL,Code =“C”
  • ID = 6,IsMandatory = NULL,ParentID = 5,Code =“A”
  • ID = 7,IsMandatory = 0,ParentID = NULL,Code =“D”

如何最好地在Linq to SQL orderby中完成?

1 个答案:

答案 0 :(得分:1)

这很困难!

困难的原因源于您首先在Parents记录属性上进行排序,然后是实际记录属性。

我尽量让变量尽可能自我解释,但如果您有任何疑问,请询问!

  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;