LINQ如何在引用的List上进行排序

时间:2018-04-03 02:25:22

标签: linq sorting

我有一个像这样定义的对象

 public class Person {
    public Person() {
        this.NewsItems = new List<NewsItem>();
    }
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age {get;set;}
    public virtual IList<NewsItem> NewsItems { get; set; }

}

NewsItem对象有一个名为DisplayOrder的属性,它的类型为int。然后我将LINQ作为以下内容:

 return _repo.GetAll<Person>().Where(p => p.age >60).ToList();

我的目标是基于DisplayOrder排序List<Person>

我将在控制器中使用此List<Person>。在此控制器中,我可以访问Person.NewsItems。我需要按顺序对List<Person>进行排序,或者在引用的列表NewsItems中对DisplayOrder进行排序。

基本上我在Person和NewsItem之间有1:m的关系。

1 个答案:

答案 0 :(得分:0)

您可以实现可与.OrderBy一起使用的自定义比较器。这可能是针对NewsItems属性的。所以你可以这样做:

 var sortedPersons = persons
            .Where(p => p.Age > 60)
            .OrderBy(x => x.NewsItems, new NewsItemsComparer());

您的NewsItemComparer可采取以下形式:

public class NewsItemsComparer : IComparer<IList<NewsItem>>
{
    public int Compare(IList<NewsItem> x, IList<NewsItem> y)
    {
        if (<logic where xDisplayOrders takes precedence over yDisplay Orders>)
        {
            return 1;
        }

        if (<logic where yDisplayOrders takes precedence over xDisplay Orders>)
        {
            return -1;
        }
        else
            return 0;
    }
}

这是一个示例实现,其中人员根据哪个NewsItems具有最低的DisplayOrder编号进行排序:https://dotnetfiddle.net/MTtwHU