Упорядочение списка 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();