Entity framework 如何从数据库中获取实体,包括导航属性和子列表总金额
我有下一个实体Entity framework 如何从数据库中获取实体,包括导航属性和子列表总金额,entity-framework,linq,Entity Framework,Linq,我有下一个实体 public class Objective { public virtual UserInfo AssignedUser { get; set; } public int? AssignedUserID { get; set; } public string ObjectiveText { get; set; } public virtual ICollection<ObjectiveTask> Tasks { get; set; }
public class Objective
{
public virtual UserInfo AssignedUser { get; set; }
public int? AssignedUserID { get; set; }
public string ObjectiveText { get; set; }
public virtual ICollection<ObjectiveTask> Tasks { get; set; }
public virtual UserInfo User { get; set; }
public int UserID { get; set; }
}
映射设置无法测量
当我对这样的查询执行此操作时
public class ObjectiveListViewModel
{
public string AssignedString { get; set; }
public string ObjectiveText { get; set; }
public int TasksCount { get; set; }
public string UserContactName { get; set; }
}
(from objective in context.Set<Objective>() select objective)
.Include(o => o.User)
.Include(o => o.AssignedUser)
.ToListAsync();
(从context.Set()中的目标选择目标)
.Include(o=>o.User)
.包括(o=>o.AssignedUser)
.ToListAsync();
一切都很酷-用户和分配的用户属性都被加载,不需要额外查询数据库来获取它们的数据
但我需要返回任务数量的目标。
为此,我创建了一个泛型类
public class EntitySubCount<TEntity>
{
public TEntity Entity { get; set; }
public int GroupCount { get; set; }
}
public class EntitySubCount
{
公共tenty实体{get;set;}
public int GroupCount{get;set;}
}
并以这种方式使用它
(from objective in context.Set<Objective>() select objective)
.Include(o => o.User)
.Include(o => o.AssignedUser)
.Select(o=> new EntitySubCount<Objective> {
Entity = o,
GroupCount = o.Tasks.Count })
.ToListAsync();
(从context.Set()中的目标选择目标)
.Include(o=>o.User)
.包括(o=>o.AssignedUser)
.Select(o=>newentitysubcount{
实体=o,
GroupCount=o.Tasks.Count})
.ToListAsync();
但未加载用户和分配的用户属性,需要对数据库进行额外的查询才能获取它们的数据。
我理解这是因为懒惰加载
问题是-我如何从数据库中获取我的实体和加载的nav。属性和一次任务数
谢谢您的帮助您就快到了。如果您正在投影,则不需要包含。在本例中,我将投影到一个匿名类型,但如果需要,您可以创建一个要投影到的ViewModel类
var objectiveList = context.Objectives
.Select(o => new
{
Entity = o,
// or you could just pick the properties:
ObjectiveText = o.ObjectiveText,
User = o.User,
AssignedUser = o.AssignedUser,
GroupCount = o.Tasks.Count
}).ToList();
编辑:我看到您已经有了ViewModel(DTO)。您可能正在寻找以下内容:
var objectiveList = context.Objectives
.Select(o => new ObjectiveListViewModel
{
AssignedString = o.AssignedUser.Name,
ObjectiveText = o.ObjectiveText,
TasksCount = o.Tasks.Count
UserContactName = o.User.Name
}).ToList();
谢谢史蒂夫的帮助。是的,它会起作用,我知道这个解决方案。我在想是否可以避免将查询结果投影到DTO。但最好不要发明任何新的东西,使用简单有效的解决方案。另一种方法是获取实体,然后使用Automapper之类的工具填充DTO/ViewModel。事实上,它有一个功能,您可以通过
.Project().To
一步完成这两项工作。谢谢Steve。我在项目中使用Automapper将实体映射到Web项目中的ViewModels,但不知道它与IQueryable一起工作。非常感谢,这为我打开了新的机会:)