2014-02-21 109 views
1

我有我需要按特定方式排序的對象列表。LINq to SQL困難的排序順序

相關表中的字段有:

  • ID(INT)
  • IsMandatory(位)
  • PARENTID(INT可爲空)
  • 代碼(VARCHAR)

我需要他們首先按IsMandatory = true排序,然後按代碼排序,但具有ParentID的任何內容都必須按代碼排序,但會直接出現在與Pa具有相同ID的行後面rentID(並且這些記錄將始終將IsMandatory設置爲NULL)。

某些樣本數據,並且這也是其中有序時也應該出現的順序:

  • ID = 1,IsMandatory = 1,PARENTID = NULL,代碼= 「A」
  • ID = 2,IsMandatory = NULL,ParentID = 1,Code =「A」
  • ID = 3,IsMandatory = NULL,ParentID = 1,Code =「B」
  • ID = 4,IsMandatory = 1,ParentID = NULL ,代碼=「B」
  • ID = 5,IsMandatory = 0,ParentID = NULL,Code =「C」
  • ID = 6,IsMandatory = NULL,PARENTID = 5,代碼= 「A」
  • ID = 7,IsMandatory = 0,PARENTID = NULL,代碼= 「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; 
+0

哇,似乎完美的工作。做得好! – johna