条件才能通过LINQ

问题描述:

我视图模型如下条件才能通过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

您可能首先选择与ID = 2的元素,然后使用Enumerable.Concat串联末休息:

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

感谢您的帮助! – Rohit

你在做什么是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

假设你没有负面因素,你可以做一个.OrderBy(m => m.ClassDiscussion.NotificationStatusID == 2 ? -1 : m.ClassDiscussion.NotificationStatusID)。这样你只需要遍历列表一次。

+0

感谢您的帮助! – Rohit