我正在尝试在单个查询中提取数据。 由于它涉及许多表格,我有点困在分组部分。
我没有足够的声誉来发布我的桌面设计图像。 所以,我给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
(针对给定的sectorId
和deviceId
)
以及所有DeviceUses
(针对相关的sectorId
和deviceId
)以及Use
的相关deviceId
以及所有Consu
(针对相关的deviceId
,levelId
,ageId
)以及相关的Age
和Level
以及所有DistributionOne
(针对相关的deviceId
,levelId
,sectorId
)以及相关的Level
以及所有DistributionTwo
(针对相关的deviceId
,levelId
,sectorId
,ageId
)以及相关的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
答案 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 {
....
})
})
});