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

时间:2017-10-23 13:31:23

标签: 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 { 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
                           {
                             ...

我在这里找不到合适的解决方案,如何将每种工作类型计入此结果模型?

2 个答案:

答案 0 :(得分:2)

我认为如果您使用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),
                                               ...
                                              });

而且我认为你不想这样做,如果我是你,我会使用第一个解决方案,或者另一个更好的我希望存在的解决方案。

答案 1 :(得分:0)

您希望可以按名称和作业类型进行分组查询 然后使用Pivot扩展转动以返回您想要的内容 http://linqlib.codeplex.com/wikipage?title=Pivot&referringTitle=Home