Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 如何从数据库中获取实体,包括导航属性和子列表总金额_Entity Framework_Linq - Fatal编程技术网

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一起工作。非常感谢,这为我打开了新的机会:)