【问题标题】:Order of 1:n relation using virtual List<T>使用虚拟 List<T> 的 1:n 关系顺序
【发布时间】:2014-11-19 21:44:36
【问题描述】:

我使用实体框架和 MVC。我需要按地址 ID 排序的地址列表。但是当我为排序封装属性时,实体框架不会填充地址列表。 我该怎么办?

public class Student
{
    public int StudentId { get; set; }
    public string Name{ get; set; }
    public string Surname{ get; set; }

    //i need this address list order by address id???
    public virtual List<StudentAddress> Address { get; set; }
}

public class StudentAddress
{
    [Key]
    public int AddressId{ get; set; }

    public string Address { get; set; }
    public string City { get; set; }

}

【问题讨论】:

  • 为什么要关心类中列表的顺序?如果您想以特定顺序显示它,请在 UI 中对其进行排序。
  • 因为我经常使用它。
  • 然后在需要时订购。另外,我怀疑按 ID 排序并不总是一个好主意,如果学生发生变化并且 ID 2 成为主要地址怎么办?
  • 你应该调用 Include 例如: db.Students.Include("Address").ToList();或 db.Students.Include(t=>t.Address).ToList();添加后使用 System.Data.Entity;

标签: c# entity-framework


【解决方案1】:

根据关系建模的标准,关系被认为是无序的,因此您不能也不应该依赖顺序,但您应该在呈现数据之前应用排序。因此,您可以选择具有有序地址的匿名类型,例如:

students.Select(x => new { Student = x, Addresses = x.Address.OrderBy(y => y.AddressId)) })

如果您担心代码重复,您可以将其包装到单独的方法中并重用它。

【讨论】:

    【解决方案2】:

    我假设当您说“但是当我为排序封装我的属性时,实体框架不会填充地址列表”时,实体框架不会填充地址列表并且您在这里使用延迟加载.

    您需要导入 System.Data.Entity 才能使用支持 lambda 的 .Include()。包含它之后,您可以在要排序的属性上应用 OrderBy(),如下所示:

    DbContext.Students.Include(s => s.Address.OrderBy(a => a.AddressId))
    

    您最好将 List 替换为 IList、IQueryable 或 IEnumerable。如果您希望支持对地址的插入操作,最好使用 IList。

    【讨论】:

      【解决方案3】:

      我不知道通过 EF/SQL 执行此操作的方法,但您可以执行以下操作:

      protected IEnumerable<StudentAddress> addresses;
      public virtual IEnumerable<StudentAddress> Address
      {
          get { return addresses; }
          set
          {
              addresses = value == null ? null : value.OrderBy(a => a.AddressId);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2019-04-15
        • 1970-01-01
        • 2017-12-22
        • 2015-08-04
        • 2021-08-30
        • 2014-05-02
        • 1970-01-01
        • 1970-01-01
        • 2015-08-29
        相关资源
        最近更新 更多