C# 修改entityframework查询以在多级选择中引入特定字段
我的代码优先模型中有三个模型类C# 修改entityframework查询以在多级选择中引入特定字段,c#,entity-framework,C#,Entity Framework,我的代码优先模型中有三个模型类 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 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; }
}
这是我目前的疑问:
var result = _dbContext.Project//<==search from details
.Include(x => x.ProjectDetail)
.Include(y => y.ProjectDetail.Select( c=> c.ProjectDetailAnswer))
}).ToList();
var result=\u dbContext.Project//x.ProjectDetail)
.Include(y=>y.ProjectDetail.Select(c=>c.ProjectDetailAnswer))
}).ToList();
我的问题如下,请>
您可以有一个ViewModel,例如:
public class ProjectViewModel
{
public Guid Id { get; set; }
// this could be a Dictionary<string, List<string>>
// if there are no duplicate DetailDescription's for a Project
public List<KeyValuePair<string, List<string>>> Details { get; set; }
}
公共类项目视图模型
{
公共Guid Id{get;set;}
//这可能是一本字典
//如果项目没有重复的详细说明
公共列表详细信息{get;set;}
}
您的查询将如下所示:
var data = _dbContext.Project
.Select(p => new ProjectViewModel
{
Id = p.Id,
Details = p.ProjectDetails
.Select(pd => new KeyValuePair<string, List<string>>(pd.DetailDescription, pd.ProjectDetailsAnswers.Select(pda => pda.AnswerDescription).ToList()))
.ToList()
})
.ToList();
var data=\u dbContext.Project
.选择(p=>new ProjectViewModel
{
Id=p.Id,
详细信息=p.ProjectDetails
.Select(pd=>newkeyvaluepair(pd.DetailDescription,pd.ProjectDetailsAnswers.Select(pda=>pda.AnswerDescription.ToList()))
托利斯先生()
})
.ToList();
您可以创建视图模型的层次结构:
public class ProjectViewModel
{
public Guid Id { get; set; }
private List<ProjectDetailViewModel> _details = new List<ProjectDetailViewModel>();
public List<ProjectDetailViewModel> Details
{
get {return _details; }
set {_details = value; }
}
}
public class ProjectDetailViewModel
{
public Guid Id {get; set;}
public string Description {get; set;}
private List<AnswerViewModel> _answers = new List<AnswerViewModel>();
public List<AnswerViewModel> Answers
{
get {return _answers; }
set {_answers = value; }
}
}
public class AnswerViewModel
{
public Guid Id {get; set;}
public string Description {get; set;}
}
公共类项目视图模型
{
公共Guid Id{get;set;}
私有列表_details=新列表();
公开名单详情
{
获取{return\u details;}
设置{u details=value;}
}
}
公共类ProjectDetailViewModel
{
公共Guid Id{get;set;}
公共字符串说明{get;set;}
私人列表_answers=新列表();
公开名单答案
{
获取{return\u answers;}
设置{u answers=value;}
}
}
公共类应答视图模型
{
公共Guid Id{get;set;}
公共字符串说明{get;set;}
}
然后
List result=\u dbContext.Projects
.其中(x=>/*条件*/)
.选择(x=>new ProjectViewModel
{
Id=x.Id,
Details=x.ProjectDetails。选择(d=>newprojectdetailviewmodel
{
Id=d.Id,
描述=d.描述,
答案=d.ProjectDetailAnswers。选择(a=>new AnswerViewModel
{
Id=a.Id,
描述
}
}
}).ToList();
这将针对数据库组成一个查询,该查询只返回所选字段,并使用包含相关答案的详细信息列表组成项目
如果您想将其展平,只需在项目下列出答案(答案中包含详细说明)
公共类项目视图模型
{
公共Guid Id{get;set;}
私人列表_answers=新列表();
公开名单答案
{
获取{return\u answers;}
设置{u answers=value;}
}
}
公共类项目详细解答视图模型
{
公共Guid Id{get;set;}
公共字符串详细说明{get;set;}
公共字符串说明{get;set;}
}
然后
List result=\u dbContext.Project
.其中(x=>/*条件*/)
.选择(x=>new ProjectViewModel
{
Id=x.Id,
Answers=x.ProjectDetails.SelectMany(d=>d.ProjectDetailAnswers)。Select(a=>newprojectdetailanswerviewmodel
{
Id=a.Id,
DetailDescription=a.ProjectDetail.Description,
描述,
}
}).ToList();
作为旁注:[必需]
对于像Guid
和DateTime
这样的值类型是不需要的,实体框架已经让它们成为必需的…当它们不可为空时谢谢,但是如果有重复的详细信息会发生什么呢?@deedee这将很好。如果使用字典就不会了。我在新的KeyValuePair中发现一个错误:>>不包含接受那么多参数的构造函数。为什么要显式声明支持字段?您不需要为集合声明支持字段,以便在我声明新实体的情况下,集合可以开始并接受新的子项,而不是初始化为#null。我相信使用C#7可以初始化使用类似于public List MyTs{get;set;}=>new List();的东西来实现属性的lize;但是我还没有尝试过这一点,只是在将新客户机系统升级到现代环境的过程中。实体框架中的常用方法是在构造函数tomäto,tomäto.:)中初始化集合
var data = _dbContext.Project
.Select(p => new ProjectViewModel
{
Id = p.Id,
Details = p.ProjectDetails
.Select(pd => new KeyValuePair<string, List<string>>(pd.DetailDescription, pd.ProjectDetailsAnswers.Select(pda => pda.AnswerDescription).ToList()))
.ToList()
})
.ToList();
public class ProjectViewModel
{
public Guid Id { get; set; }
private List<ProjectDetailViewModel> _details = new List<ProjectDetailViewModel>();
public List<ProjectDetailViewModel> Details
{
get {return _details; }
set {_details = value; }
}
}
public class ProjectDetailViewModel
{
public Guid Id {get; set;}
public string Description {get; set;}
private List<AnswerViewModel> _answers = new List<AnswerViewModel>();
public List<AnswerViewModel> Answers
{
get {return _answers; }
set {_answers = value; }
}
}
public class AnswerViewModel
{
public Guid Id {get; set;}
public string Description {get; set;}
}
List<ProjectViewModel> result = _dbContext.Projects
.Where(x => /* conditions */)
.Select(x => new ProjectViewModel
{
Id = x.Id,
Details = x.ProjectDetails.Select(d => new ProjectDetailViewModel
{
Id = d.Id,
Description = d.Description,
Answers = d.ProjectDetailAnswers.Select(a => new AnswerViewModel
{
Id = a.Id,
Description = a.Description
}
}
}).ToList();
public class ProjectViewModel
{
public Guid Id { get; set; }
private List<ProjectDetailAnswertViewModel> _answers = new List<ProjectDetailAnswertViewModel>();
public List<ProjectDetailAnswertViewModel> Answers
{
get {return _answers; }
set {_answers = value; }
}
}
public class ProjectDetailAnswertViewModel
{
public Guid Id {get; set;}
public string DetailDescription {get; set;}
public string Description {get; set;}
}
List<ProjectViewModel> result = _dbContext.Project
.Where(x => /* conditions */)
.Select(x => new ProjectViewModel
{
Id = x.Id,
Answers = x.ProjectDetails.SelectMany(d => d.ProjectDetailAnswers).Select(a => new ProjectDetailAnswerViewModel
{
Id = a.Id,
DetailDescription = a.ProjectDetail.Description,
Description = a.Description,
}
}).ToList();