复杂查询LINQ Lambda
本文关键字:Lambda LINQ 查询 复杂 | 更新日期: 2023-09-27 18:06:01
我试图在单个查询中提取数据。因为它涉及许多表,我有点卡在分组部分。
我没有足够的声誉来发布我的表格设计图像。所以我让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
)以及deviceId
的相关Use
和所有Consu
(对于相关deviceId
, levelId
, ageId
)以及相关Age
和Level
和所有DistributionOne
(对于相关deviceId
, levelId
, sectorId
)和相关Level
和所有DistributionTwo
(对于相关deviceId
, levelId
, sectorId
, ageId
)以及相关Age
和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
是获取Devices
集合的存储库方法。
我的问题:
我这样做对吗?
如果是,那么我如何将数据分组以获得
的嵌套集合
家庭
->类别——
>设备DistributionOne
DistributionTwo
..等
- 如果不是,那么我需要纠正(我的表设计?,查询?)
使用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 {
....
})
})
});