实体框架从具有子实体的父实体中提取简单列表

本文关键字:实体 提取 简单 列表 框架 | 更新日期: 2023-09-27 18:33:38

我有两个类:

public class Profile
{
    public int ProfileID { get; set; }
    public string ProfileDescription { get; set; }
    public int DisplayOrder { get; set; }
    public virtual ICollection<Role> Roles { get; set; }
}

public class Role
{
    public int RoleID { get; set; }
    public string RoleDescription { get; set; }
    public int DisplayOrder { get; set; }
    public virtual ICollection<Profile> Profiles { get; set; }
}

与 DbContext

public DbSet<Profile> Profiles { get; set; }
public DbSet<Role> Roles { get; set; }

配置文件是父级,匹配的角色集合是子级我有几个类似的课程。

我想生成一个仅包含两个必需属性的选择列表

ProfileID, ProfileDescription

在查询中

SelectList(dbContext.Profiles.OrderBy(x => x.DisplayOrder).ToList(), "ProfileID", "ProfileDescription");

这没有带回子角色的开销

我不知道如何以一般方式执行此操作(返回没有孩子的父母)

实体框架从具有子实体的父实体中提取简单列表

您可以使用以下方法获取仅包含两个属性的配置文件列表

var profiles = dbContext.Profiles
      .Select(x => new {
             ProfileID = x.ProfileID,
             ProfileDescription = x.ProfileDescription
       }).OrderBy(x => x.DisplayOrder).ToList();
SelectList profilelist = new SelectList(profiles, "ProfileID", "ProfileDescription");

由于您将导航属性标记为 virtual ,因此实体框架只会在您访问相关项时提取它们。如果不这样做,实体框架将不会或至少不应该访问它们。注意:在调试中将实体添加到监视列表将导致 EF 获取相关项。

如果在使用 ToList() 具体化查询之前添加Include(profile => profile.Roles),它将加载相关项目。

有关加载相关项目的详细信息,请查看 MSDN 上的这篇文章。