我正在将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();
但是我真的不知道它是什么类型的数据结构。因为我想将其传递给强类型视图。
我的问题:减少从数据库加载的记录数量的方法可以吗?
我怎么知道我的结果对象是哪种数据结构? (请记住,我想将结果对象传递给强类型视图)
答案 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();