复杂查询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(给定sectorIddeviceId)

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

和所有Consu(对于相关deviceId, levelId, ageId)以及相关AgeLevel

和所有DistributionOne(对于相关deviceId, levelId, sectorId)和相关Level

和所有DistributionTwo(对于相关deviceId, levelId, sectorId, ageId)以及相关AgeLevel

到目前为止,我得到的方法如下:

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;
    }

其中repoDevice的存储库

GetAll是获取Devices集合的存储库方法。

我的问题:

  • 我这样做对吗?

  • 如果是,那么我如何将数据分组以获得

  • 的嵌套集合

家庭
->类别——
>设备DistributionOne
DistributionTwo
..等

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

复杂查询LINQ Lambda

使用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 {
                ....
        })
   })
});