使用虚拟列表的 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; }
}
根据关系建模的标准,关系被视为无序,因此您不能也不应该依赖顺序,但您应该在呈现数据之前应用排序。因此,您可以选择具有有序地址的匿名类型,例如:
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);
}
}