2016-11-15 54 views
0

我視圖模型如下條件才能通過LINQ

public class LMS_ClassDiscussionListViewModel 
{ 
    public int ReplyCount { get; set; } 
    public LMS_ClassDiscussion ClassDiscussion { get; set; } 
} 

並且其是上視圖模型稱爲模型LMS_ClassDiscussion如下

public partial class LMS_ClassDiscussion 
{ 
    [Key] 
    public int ClassDiscussionID { get; set; } 
    public int? ParentClassDiscussionID { get; set; } 
    public int MessageTypeID { get; set; } 
    public int ClassID { get; set; } 
    public int DiscussionUserID { get; set; } 
    public int NotificationStatusID { get; set; } 
    public string Discussion { get; set; } 
    public DateTime DiscussionDate { get; set; } 
    public bool IsPrivate { get; set; } 
    public bool IsRead { get; set; } 
    public string DiscussionTitle { get; set; } 
} 

我正在記錄列表如下

List<LMS_ClassDiscussionListViewModel> modelList = GetData(); 

所以,這個清單我想根據NotificationStatusID = 2排序。

意思是,那些有NotificationStatusID作爲2的記錄應該先來休息一下。

所以,爲了這個,我曾嘗試以下方法,但該列表是沒有得到排序

modelList = modelList.OrderBy(x => x.ClassDiscussion.NotificationStatusID) 
        .ThenBy(x => x.ClassDiscussion.NotificationStatusID == 2) 
        .ToList(); 

我如何可以排序此列表NotificationStatusID = 2

謝謝!

+1

您可以使用concat(id爲2的工具項目id爲2的項目列表) – aguetat

回答

1

您可能首先選擇與ID = 2的元素,然後使用Enumerable.Concat串聯末休息:

var result = modelList.Where(x => x.ClassDiscussion.NotificationStatusID == 2) 
     .Concat(modeList.Where(x => x.ClassDiscussion.NotificationStatusID != 2)); 
+0

感謝您的幫助! – Rohit

2

你在做什麼是NotificationStatusID爲主要排序標準進行排序,這將對一切順序。然後在該訂單內,您訂購NotificationStatusID == 2

你可以做的是編寫一個比較器,它實現了IComparer<int>,並將所有元素的值爲2放在列表的頂部。然後你可以在SortBy中使用這個比較器(對此有一個超載)。

如果你想保存自己的比較器,試試這個:

modelList = modelList.OrderBy(x => x.ClassDiscussion.NotificationStatusID == 2 ? Int32.MinValue : x.ClassDiscussion.NotificationStatusID) 

這將把爲2的值作爲Int32.MinValue,將它們移到右上邊的所有元素。

+0

感謝您的幫助! – Rohit

2

假設你沒有負面因素,你可以做一個.OrderBy(m => m.ClassDiscussion.NotificationStatusID == 2 ? -1 : m.ClassDiscussion.NotificationStatusID)。這樣你只需要遍歷列表一次。

+0

感謝您的幫助! – Rohit