使用虚拟列表的 1:n 关系的顺序

本文关键字:关系 顺序 虚拟 列表 | 更新日期: 2023-09-27 18:30:56

我使用实体框架和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; }
}

使用虚拟列表<T>的 1:n 关系的顺序

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

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

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

我假设当您说"但是当我封装属性我的排序时,实体框架不会填充地址列表",实体框架不会填充地址列表,并且您在此处使用延迟加载。

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

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

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

我不知道

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

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