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

使用Linq到SQL的困难排序顺序,linq,linq-to-sql,Linq,Linq To Sql,我有一个需要按特定方式排序的对象列表 相关表格字段包括: ID(int) IsMandatory(位) ParentID(int可为空) 代码(varchar) 我需要先按IsMandatory=true排序,然后按代码排序,但是任何具有ParentID的内容都必须按代码排序,但必须直接显示在具有与ParentID相同ID的行之后(并且这些记录将始终将IsMandatory设置为NULL) 一些示例数据,这也是它们在订购时的显示顺序: ID=1,IsMandatory=1,ParentID

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

相关表格字段包括:

  • ID(int)
  • IsMandatory(位)
  • ParentID(int可为空)
  • 代码(varchar)
我需要先按IsMandatory=true排序,然后按代码排序,但是任何具有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到SQL orderby中最好地实现这一点?

这是一个困难的排序

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

我试着让变量尽可能自解释,但是如果你有任何问题,请提问

  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;