【问题标题】:How to get Entity from DB including navigation properties and child list total amount如何从数据库中获取实体,包括导航属性和子列表总量
【发布时间】:2017-08-17 04:13:21
【问题描述】:

我有下一个实体

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; }
}

一个目标可以有一个分配的用户和一个用户,但有很多任务。

从 DB 获取实体后,我将其映射到 DTO 类,如下所示

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

一切正常 - 加载用户和分配的用户属性,无需对数据库进行额外查询以获取其数据。

但我需要任务数量的回报目标。 为此,我创建了一个通用类

public class EntitySubCount<TEntity>
{
    public TEntity Entity { 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();

但是用户和分配的用户属性没有加载,它需要额外的查询数据库来获取他们的数据。 我理解这是因为延迟加载。

问题是 - 我如何从数据库中获取加载导航的实体。属性和任务计数?

感谢您的帮助

【问题讨论】:

    标签: entity-framework linq


    【解决方案1】:

    你很接近。如果您正在投影,则不需要包含。在这种情况下,我投影到匿名类型,但如果需要,您可以创建一个 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。事实上,它有一个extension,您可以在其中使用.Project().To&lt;ObjectiveListViewModel&gt; 一步完成。
    • 谢谢史蒂夫。我在我的项目中使用 Automapper 将实体映射到 Web 项目中的 ViewModel,但不知道它可以与 IQueryable 一起使用。非常感谢,它为我打开了新的机会:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 2021-06-26
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多