【问题标题】:Entity Framework Core: Request for Composite Table (Composite Key)Entity Framework Core:对组合表的请求(组合键)
【发布时间】:2018-05-24 07:25:51
【问题描述】:

我。你好!我为我的模型创建了一个复合键 ProjectSubProjectProjectSubProject。我在创建 GetAllProjects 请求时遇到问题,我想要一个

IGrouping<Project, IEnumerable<SubProject>> or IDictionary 结构,但我得到IGrouping<Project, IEnumerable<GetAllProjectsViewModel>>

这是我的要求:

return _context.ProjectSubProjects
                .Include(ps => ps.Project)
                .Include(ps => ps.SubProject)
                .Select(ps => new GetAllProjectsViewModel
                {
                    Project = ps.Project,
                    SubProject = ps.SubProject,
                })
                .GroupBy(ps => ps.Project);

Project.cs:

public class Project
    {
        // PK
        public int Id { get; set; }

        public string ProjectName { get; set; }

    }

SubProject.cs:

public class SubProject
    {
        // PK
        public int Id { get; set; }

        public string SubProjectName { get; set; }
    }

ProjectSubProject.cs

public class ProjectSubProject
    {
        // PK
        public int ProjectId { get; set; }
        public Project Project { get; set; }

        // PK
        public int SubProjectId { get; set; }
        public SubProject SubProject { get; set; }
    }

【问题讨论】:

  • 因为您选择的是GetAllProjectsViewModel

标签: c# entity-framework linq entity-framework-6 entity-framework-core


【解决方案1】:

要从您的模型中获取IEnumerable<IGrouping<Project, IEnumerable<SubProject>>>,不需要IncludeSelect。您可以简单地使用 GroupBy 方法重载,它允许您传递元素选择器:

return _context.ProjectSubProjects
    .GroupBy(ps => ps.Project, ps => ps.SubProject);

更新:为了在 Json 表示中包含项目信息,您可以将结果投影到具有 ProjectSubProjects 属性的某些特殊或匿名类型的可枚举。像这样的:

return _context.ProjectSubProjects
    .GroupBy(ps => ps.Project, ps => ps.SubProject)
    .Select(g => new { Project = g.Key, SubProjects = g });

【讨论】:

  • 我需要Include 这个,因为我在我的应用程序中返回值。这是 WebApi 方法。如果我像上面那样做,我会得到IGrouping<Project,Subproject>
  • Include 在这里没有意义(不管是什么类型的方法)。 Include 用于将相关数据加载到实体中。但是您根本没有返回 ProjectSubProject 实体的实例,因此也没有加载相关数据。整个结果由GroupBy 查询生成。
  • 是的,谢谢我尝试获取值并且一切正常。感谢您的描述
  • 但是我有一个问题,我得到了数据,但没有关于项目的信息,只有 id,如果我添加 ProjectName 或其他东西 GroupBy 用 Id 替换它:
  • 我添加有问题的图片
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 2018-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
  • 2016-08-04
相关资源
最近更新 更多