LINQ:加入5或6个表并逐个分组,然后对groupby数据进行计数

时间:2016-01-31 13:38:45

标签: c# entity-framework linq lambda

表格是:从子级别到父级别:

  

TRAINING_TEACHER> TEACHER> INSTITUTE> SUBDISTRICT> DISTRICT   ZONE(DIVISION)


我需要显示学院名称,并且由SUBDISTRICT参加培训组的男女老师。我的视图模型是:

 public class TRAINING_STATUS_VIEW_MODEL
  {
    public int countMale { get; set; }
    public int countFemale { get; set; }
    public ZONE ZONE_VIEW_MODEL { get; set; }
    public DISTRICT DISTRICT_VIEW_MODEL { get; set; }
    public SUBDISTRICTUPAZILA_VIEW_MODEL { get; set; }
    public INSTITUTE INSTITUTE_VIEW_MODEL { get; set; }
  }

其中countMale,countFemale是TRAINING_TEACHER表中每个学院的教师数量。 TEACHER表中有一个性别列。 现在这里是我无法按学院和计数进行分组的查询。

var trainingStatusReport = 
from trainingTeacher in db.TRAINING_TEACHER 
join teacher in db.TEACHERs on trainingTeacher.TEACHER_NO equals teacher.TABLE_ID 
join institute in db.INSTITUTEs on teacher.INS_ID equals institute.INS_ID
join subDistrict in db.subDistricts on institute.LOC_ID equals (decimal)subDistrict.LOC_ID
join district in db.DISTRICTs on (decimal)subDistrict.DCODE equals (decimal)district.DCODE
join zone  in db.ZONEs on  district.ZC equals  zone.ZC   
select new TRAINING_STATUS_VIEW_MODEL { 
..........
.......... I can't go here
} ;

我已经通过institute.ins_id尝试了group institute,但无法在select部分编写代码。

1 个答案:

答案 0 :(得分:0)

使用进一步加入的分组是可能的,但可能效率低下。

是一个更好的联接替代方案
  1. 使用导航属性
  2. 使用let语句来简化任何其他复杂逻辑。
  3. 以下是如何将两者结合起来的示例。这会解决问题吗?

    var trainingStatusReport =
        from trainingTeacher in db.TRAINING_TEACHER
        group trainingTeacher by trainingTeacher.Teacher.Institute into instituteGroup
        let institute = instituteGroup.Select(t => t.Teacher.Institute).FirstOrDefault()
        select new TRAINING_STATUS_VIEW_MODEL
        {
            countMale = instituteGroup.Count(t => t.Teacher.Gender == Male),
            countFemail = instituteGroup.Count(t => t.Teacher.Gender == Femail),
            ZONE = institute.SubDistrict.District.Zone,
            DISTRICT = institute.SubDistrict.District,
            SUBDISTRICT = institute.SubDistrict,
            INSTITUTE = institute
        };