Упорядочение списка linq на основе свойства дочернего класса

У меня есть следующий класс:

public class CourseSection
{
    [Key]
    public int CourseSectionID { get; set; }

    public int CourseID { get; set; }

    public string Title { get; set; }

    public virtual ICollection<SectionContent> SectionContents { get; set; }
}

И дочерний класс SectionContent выглядит так:

public class SectionContent
{
    [Key, Column(Order = 0)]
    public int CourseSectionID { get; set; }
    [ForeignKey("CourseSectionID")]
    public virtual CourseSection CourseSection { get; set; }

    [Key, Column(Order = 1)]
    public int ContentID { get; set; }
    [ForeignKey("ContentID ")]
    public virtual Content Content { get; set; }

    public int ContentOrder { get; set; }
}

Я хочу иметь возможность сортировать список содержимого раздела по полю ContentOrder, в моей таблице содержимого раздела есть следующие данные:

CourseSectionID         ContentID         ContentOrder
1                       212               1
1                       208               2
1                       214               3
1                       210               4

Но при отображении этого в представлении мне не удалось упорядочить содержимое раздела на основе свойства ContentOrder. Он отображается на основе ContentID, поэтому он отображается как 208,210,212,214. Как я могу заказать SectionContents на основе этого свойства? Это мой код просмотра бритвы:

foreach (var sectionItem in Model.CourseSections)
{                     
  <li>
    <h5 class="accordion-title">@sectionItem.Title<span class="accordion-icon"></span></h5>
      <div class="accordion-content">
        <ul>                                    
        @foreach (var subSectionItem in sectionItem.SectionContents)
        {
          <li><a href="#" id="menuItem @subSectionItem.ContentID @sectionItem.CourseSectionID" onclick="SubItemMenu(id)">@subSectionItem.Content.Name</a></li> 
        }
        </ul>
      </div>
  </li>
}              

3 ответа

Решение

Метод расширения OrderBy - это то, что вы ищете.

@foreach (var subSectionItem in sectionItem.SectionContents.OrderBy(item => item.ContentOrder))
{
      <li><a href="#" id="menuItem @subSectionItem.ContentID @sectionItem.CourseSectionID" onclick="SubItemMenu(id)">@subSectionItem.Content.Name</a></li> 
}

Просто добавьте OrderBy() заявление к вашему foreach...

foreach (var sectionItem in Model.CourseSections)
{                     
  <li>
    <h5 class="accordion-title">@sectionItem.Title<span class="accordion-icon"></span></h5>
      <div class="accordion-content">
        <ul>                                    
        @foreach (var subSectionItem in sectionItem.SectionContents.OrderBy(sc => sc.ContentOrder))
        {
          <li><a href="#" id="menuItem @subSectionItem.ContentID @sectionItem.CourseSectionID" onclick="SubItemMenu(id)">@subSectionItem.Content.Name</a></li> 
        }
        </ul>
      </div>
  </li>
}

В качестве альтернативы вы можете сделать OrderBy() когда вы сначала извлекаете данные, а затем предполагаете, что все в правильном порядке, по вашему мнению, выбор за вами.

Я полагаю, у вас есть какой-то сервисный метод, возвращающий вашу модель CourseSection. В этом методе установите свойство отсортированной модели:

var myCourseModel = buildMyCourseSection();
myCourseModel.SectionContents = (from sc in myCourseModel.SectionContents 
    order by sc.ContentOrder
    select sc).ToArray();
Другие вопросы по тегам