【问题标题】:Ordering a linq list based on a property of a child class根据子类的属性对 linq 列表进行排序
【发布时间】:2014-03-03 11:44:39
【问题描述】:

我有以下课程:

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 字段对 sectioncontent 列表进行排序,我的 sectioncontent 表中有以下数据:

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>
}              

【问题讨论】:

    标签: c# linq virtual icollection


    【解决方案1】:

    只需将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(),然后假设在您的视图中它们的顺序正确 - 选择权在您手中。

    【讨论】:

      【解决方案2】:

      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> 
      }
      

      【讨论】:

      • 干杯不错,我正在尝试这个,但是 subSectionItem.ContentOrder 它无法识别,项目再次成功了,谢谢
      • @Jay 只是为了加我的 2 美分 - 不管你叫什么 item。如果你愿意,你可以称它为PaddingtonBear12345,但它仍然可以工作。它只是一个SectionContent 项目实例的变量名。这就是为什么在我的回答中,我称它为 sc 代表 SectionContent
      • 我正在尝试 subSection 我猜可能是其他变量的类
      【解决方案3】:

      我想你有某种服务方法返回你的 CourseSection 模型。在该方法中,设置排序后的模型属性:

      var myCourseModel = buildMyCourseSection();
      myCourseModel.SectionContents = (from sc in myCourseModel.SectionContents 
          order by sc.ContentOrder
          select sc).ToArray();
      

      【讨论】:

      • 上一个答案帮助我只是没有标记它但感谢您的输入:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 2013-07-31
      • 2021-06-27
      • 1970-01-01
      • 2012-11-14
      • 2015-02-02
      相关资源
      最近更新 更多