2013-10-02 45 views
3

父实体简单的列表我有两个类:实体框架提取具有子实体

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"); 

不具有带回子角色

的开销

选择列表我不知道如何以一般方式做到这一点(返回父母没有孩子)

+0

究竟是什么问题得到只有两个属性配置文件列表? –

+0

查询不仅返回配置文件,还返回匹配的角色。对于大型数据集来说,这是一个很大的开销。 –

+1

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

回答

1

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

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

在MSDN上查看this article以获取关于加载相关项目的更多信息。

3

您可以使用

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"); 
+0

也谢谢你;这工作完美。我很幸运有两个完整的答案,但可悲的是不能接受这两个答案。 –

+0

@PeterSmith谢谢你的赞赏,如果你喜欢然后投我的答案 –

+0

我已经做了! :-) –