Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
C# 修改entityframework查询以在多级选择中引入特定字段_C#_Entity Framework - Fatal编程技术网

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();
我的问题如下,请>

  • 如何修改实体框架查询以使
  • Project.Id,包含所有ProjectDetailsAnswerDescription的projectDetail.DetailDescription列表

  • 建议使用viewmodel,该viewmodel可以包含问题1中查询的结果

  • 您可以有一个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();