在多个表之间构建关系 linq 查询
build relational linq query among multiple tables
我会尽量说清楚;
我的第一个 table 包含 类型 的职位;
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; }
}
查询结果应该有答案; "Number of finished work for each job type of each employee"
例如,结果应如下所示:
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 extension 将 Pivot 扩展到 return 你想要的
http://linqlib.codeplex.com/wikipage?title=Pivot&referringTitle=Home
我认为如果您使用 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),
...
});
而且我认为您不想那样做,如果我是您,我会使用第一个解决方案,或者我希望存在的更好的另一个解决方案。
我会尽量说清楚; 我的第一个 table 包含 类型 的职位;
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; }
}
查询结果应该有答案; "Number of finished work for each job type of each employee" 例如,结果应如下所示:
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 extension 将 Pivot 扩展到 return 你想要的 http://linqlib.codeplex.com/wikipage?title=Pivot&referringTitle=Home
我认为如果您使用 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),
...
});
而且我认为您不想那样做,如果我是您,我会使用第一个解决方案,或者我希望存在的更好的另一个解决方案。