如何通过实体框架查询确定自定义类

时间:2018-07-18 03:16:25

标签: c# asp.net-mvc entity-framework-6

我正在将ASP.NET MVC与C#和实体框架一起使用。我的代码优先模型中有三个模型类。

public class Project
{
    public Guid Id { get; set; }
    public guid ProjectTypeId{ get; set; }
    public string projectType{ get; set; }
    [Required]
    public DateTime CreationDate{ get; set; }
    //more properties here
    //...
    public bool Activated{ get; set; }
    public IList<ProjectDetail> ProjectDetails{ get; set; }
}

您会看到一个项目有很多细节。

public class ProjectDetail
{
    [Required]
    public Guid Id { get; set; }
    public Project Project{ get; set; }
    [Required]
    public Guid ProjectId{ get; set; }             
    public string DetailDescription{ get; set; }
    public IList<ProjectDetailsAnswer> ProjectDetailsAnswers{ get; set; }
}

一个projectDetail有很多答案:

public class ProjectDetailsAnswer
{
    [Required]
    public Guid Id { get; set; }
    [Required]
    public Guid ProjectDetailId{ get; set; }
    public ProjectDetail ProjectDetail{ get; set; }       
    public string OtherField{ get; set; }
    [Required]
    [MaxLength(512)]
    public string AnswerDescription{ get; set; }
}

我想做的是使用带有lambda表达式的Entity Framework加载视图模型

public class MyViewModel
{
    public Guid projectTypeId{ get; set; }
    public string projectType { get; set; }
    public string DetailDescription { get; set; }
    public IEnumerable<string> AnswerDescription{ get; set; }//this propertie comes from ProjectDetailsAnswer.AnswerDescription
}

这是我的查询

var result = _dbContext.ProjectDetails //<==search from details
        .Select(x => new ProjectDetailViewModel
        {
            projectTypeId = x.Project.ProjectTypeId,
            projectType = x.Project.projectType,
            DetailDescription = x.DetailDescription,
            AnswerDescription = x.ProjectDetailsAnswers.Select(a => a.AnswerDescription)
        }).ToList();

但是我意识到我应该使用group by,因为前一个查询给了我100条记录(如果项目表有10条记录,projectdetail 10和projectdetailAnswers 10,我将带来1000条记录,因为它给了我一个列表视图模型)。

因此,我最终得到了此查询,以按ProjectTypeId进行分组:

var result = _dbContext.ProjectDetails //<==search from details
        .Select(x => new ProjectDetailViewModel
        {
            projectTypeId = x.Project.ProjectTypeId,
            projectType = x.Project.projectType,
            DetailDescription = x.DetailDescription,
            AnswerDescription = x.ProjectDetailsAnswers.Select(a => a.AnswerDescription)
        }).GroupBy(x=>x.ProjectTypeId).ToList();

但是我真的不知道它是什么类型的数据结构。因为我想将其传递给强类型视图。

我的问题:减少从数据库加载的记录数量的方法可以吗?

我怎么知道我的结果对象是哪种数据结构? (请记住,我想将结果对象传递给强类型视图)

1 个答案:

答案 0 :(得分:1)

最好进行查询,使其仅返回所需结果而不是获取大量记录,然后对其进行过滤。我认为这段代码是更好的选择:

var result = _dbContext.ProjectDetails.ProjectDetailsAnswers //<==search from details
        .Select(x => new ProjectDetailViewModel
        {
            projectTypeId = x.ProjectDetail.Project.ProjectTypeId,
            projectType = x.ProjectDetail.Project.projectType,
            DetailDescription = x.ProjectDetail.DetailDescription,
            AnswerDescription = x.Select(a => a.AnswerDescription)
        }).ToList();