复杂查询LINQ Lambda

时间:2014-05-31 23:22:26

标签: c# linq entity-framework-4.1

我正在尝试在单个查询中提取数据。 由于它涉及许多表格,我有点困在分组部分。

我没有足够的声誉来发布我的桌面设计图像。 所以,我给PK,FK

 Sector (SectorId)
 Device (DeviceId:PK, CategoryId:FK)
 Ratio (SectorId,DeviceId)
 Use (UseId)
 DeviceUse (SectorId,DeviceId,UseId)
 Family (FamilyId)
 Category (CategoryId)
 Level (LevelId)
 Age(AgeId)
 Consu (SectorId,DeviceId,LevelId)
 DistributionOne (SectorId,DeviceId,LevelId)
 DistributionTwo (SectorId,DeviceId,LevelId, AgeId)

我想要实现的目标是:

给定sectorId,从所有给定的表中检索所有相关信息。

结果将是:

所有Devices

Family分组

Category分组

以及所有Ratios(针对给定的sectorIddeviceId

以及所有DeviceUses(针对相关的sectorIddeviceId)以及Use的相关deviceId

以及所有Consu(针对相关的deviceIdlevelIdageId)以及相关的AgeLevel

以及所有DistributionOne(针对相关的deviceIdlevelIdsectorId)以及相关的Level

以及所有DistributionTwo(针对相关的deviceIdlevelIdsectorIdageId)以及相关的Age和{{1} }

到目前为止,我得到了一个方法如下。

Level

其中public IEnumerable<UserConfig> GetDeviceType(int sectorId) { var t = repo.GetAll().AsQueryable() .Select( c => new UserConfig { Device = new Device { Name = c.Name, Id = c.Id }, DistributionOne = c.DistributionOne.Where(d => d.SectorId == sectorId && d.DeviceId == c.Id).ToList(), DistributionTwo = c.DistributionTwo.Where(d => d.SectorId == sectorId && d.DeviceId == c.Id).ToList(), Consu = c.Consu.Where(d=>d.DeviceId == c.Id).ToList(), Category = c.Category, Family = c.Category.Family, DeviceUse = c.DeviceUse.Where(d => d.SectorId == sectorId && d.DeviceId == c.Id).ToList(), Ratios = c.Ratios.Where(d => d.SectorId == sectorId && d.DeviceId == c.Id).ToList(), Use = c.DeviceUse.Where(d=>d.DeviceId==c.Id && d.SectorId==sectorId).Select(u=>u.Use).FirstOrDefault() }); var devices = t.ToList(); return devices; } repo

的存储库

Device是获取GetAll

集的存储库方法

我的问题:

  • 我是以正确的方式做的吗?

  • 如果是,那么如何对数据进行分组以获得嵌套的

  • 集合
  

家庭
   - &GT;分类
  ---&GT;设备
  DistributionOne
  DistributionTwo
  ..etc

  • 如果没有,那么我需要纠正什么(我的表设计?,查询?)

1 个答案:

答案 0 :(得分:1)

使用GroupBy运算符:

var t = repo.GetAll().AsQueryable()
.GroupBy(c => c.Category.Family.ID)
.Select(g => new {
    FamilyID = g.Key,
    DevicesByCategory = g.GroupBy(c => c.Category.ID)
        .Select(g2 => new {
            CategoryID = g2.Key,
            Devices = g2.Select(c => new UserConfigs {
                ....
        })
   })
});