C# 在多个表之间构建关系linq查询

C# 在多个表之间构建关系linq查询,c#,entity-framework,linq,linq-to-entities,C#,Entity Framework,Linq,Linq To Entities,我会尽我所能把它说清楚; 我的第一个表包含作业的类型 public class JobTypes: Entity { public string Code { get; set; } } 这是我的第二个实体,它包含所有作业 public class FinishedWork: Entity { public string JobTypeCode { get; set; } public int DepartmentId {

我会尽我所能把它说清楚; 我的第一个表包含作业的类型

public class JobTypes: Entity
    {
        public string Code { get; set; }
    }
这是我的第二个实体,它包含所有作业

public class FinishedWork: Entity
    {
        public string JobTypeCode { get; set; }
        public int DepartmentId { get; set; }
        public int EmployeeId { get; set; }
    }
员工及部门:

public class Employee: Entity
    {
        public string Name { get; set; }
    }
public class Department: Entity
    {
        public string DepartmentName { get; set; }
    }
查询结果应回答;“每个员工的每种工作类型的已完成工作数” 例如,结果应该如下所示:

Employee JobType1 JobType2 ... JobType122  DepartmentName (Yes, there is 122 job type and result should tell how many work done by alice each job)
Alice    2         0       ... 0,          AccountManagement
...
以及我的疑问来实现它

var mdl = (from m in FinishedWork
                           join t in JobTypes m.JobTypeCode equals t.Code
                           join d in Department on m.DepartmentId equals d.ID
                           join e in Employee on m.EmployeeId equals e.ID
                           group m by new { e.ID, e.Name, m.JobTypeCode } into grp
                           select new ResultModel
                           {
                             ...

我在这里找不到合适的解决方案,如何将每个作业类型的计数输入到结果模型中?

您可以通过名称和作业类型对组进行查询 然后使用pivot扩展来返回所需的数据

我认为如果您使用
FinishedWork
实体作为起点,并在模型中使用导航属性,您的查询可能会得到改进:

var query =context.FinishedWork.GroupBy(fw=>new{fw.Employee.Name,fw.Department.DepartmentName})
                               .Select(g=>g.GroupBy(fw=>fw.JobTypeCode )
                                           .Select(g1=>new {g.Key.Name,
                                                            g.Key.DepartmentName,
                                                            g1.Key,
                                                            g1.Count()}));
问题是,我不知道如何在匿名类型中为每个内部组(表示作业类型)添加字段,而不知道自开始以来组的数量,以执行以下操作:

var query =context.FinishedWork.GroupBy(fw=>new{fw.Employee.Name,fw.Department.DepartmentName})
                               .Select(g=>new {g.Key.Name,
                                               g.Key.DepartmentName,
                                               JobType1=g.Count(fw=>fw.JobTypeCode==code1),
                                               JobType2=g.Count(fw=>fw.JobTypeCode==code2),
                                               ...
                                              });

我想你不想这么做,如果我是你,我会使用第一个解决方案,或者另一个更好的,我希望它存在

为什么不在EF中使用关系作为简单的列表映射?如果将完整代码存储在
FinishedWork
实体中,那么
JobTypes
实体的意义何在?@FilipCordas我理解你的意思,但在切换我的逻辑之前,让我们把重点放在查询上,如果我不能,那么好吧,我们可以讨论it@Rafalon,有很多属性,我只是把它缩短了,以便把事情弄清楚