【问题标题】:build relational linq query among multiple tables在多个表之间构建关系 linq 查询
【发布时间】:2017-10-23 13:31:23
【问题描述】:

我会尽量说清楚; 我的第一个表包含 types 工作;

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
                           {
                             ...

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

【问题讨论】:

  • 你为什么不在 EF 中使用关系这个接缝成为简单的列表映射?
  • 如果您将完整代码存储在您的FinishedWork 实体中,您的JobTypes 实体有什么意义?
  • @FilipCordas 我明白你的意思,但是在切换我的逻辑之前让我们专注于查询,如果我不能,那么我们可以讨论它
  • @Rafalon,有很多属性我只是把事情弄短了

标签: c# entity-framework linq linq-to-entities


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多