Linq选择子查询

时间:2012-10-04 09:40:13

标签: linq

正如标题所述,我正在尝试在Linq-To-SQL中执行select子查询。这是我的情况:

我有一个数据库视图,它返回以下字段:

  • 的SourceID
  • LicenseId
  • LicenseName
  • CharacteristicId
  • CharacteristicName

现在我希望能够将它存储在具有以下属性的我的模型中

  • 编号
  • 名称
  • 特征(这是具有Id,名称和图标的List => Icon是byte [])

这是我写的查询不起作用:

var licensesWithCharacteristics =
                _vwAllLicensesWithAttributesAndSourceIdRepository.GetAll()
                .Where(x => x.SourceID == sourceId)
                .Select(a => new LicenseWithCharacteristicsModel()
                {
                    LicenseId = a.LicenseId,
                    LicenseName = a.LicenseName
                        ,CharacteristicList = _vwAllLicensesWithAttributesAndSourceIdRepository.GetAll()
                     .Where(x => x.LicenseId == a.LicenseId)
                     .Select(c => new CharacteristicModel { Id = c.CharacteristicID, Name = c.CharacteristicName, Icon = c.Icon })
                     .Distinct().ToList()
                })
                .Distinct().ToList();

你会如何解决这个问题?我试图在一个查询中执行此操作以保持我的表现,但我有点卡住了。

1 个答案:

答案 0 :(得分:1)

您的示例查询和模型不是那么连贯(Icon来自哪里,特征或特征列表),但无论如何。

我分两部分进行,您当然可以在一个查询中重新组合。 我在分组后枚举结果,你可以尝试不进行枚举(所有在linq中都是sql,但不确定它是否可行)。

var groupedResult = 
     _vwAllLicensesWithAttributesAndSourceIdRepository.GetAll()
         .Where(x => x.SourceID == sourceId)
         .GroupBy(m => new {m.LicenseId, m.LicenseName})
         .ToList();

var results = groupedResult.Select(group => new LicenseWithCharacteristicsModel {
                  LicenseId = group.Key.LicenseId,
                  LicenseName = group.Key.LicenseName,
                  Characteristics = group.Select(m=> new CharacteristicModel {
                       Id = m.CharacteristicId,
                       Name = m.CharacteristicName
                      }).ToList()
                  });
“单一查询”中的

_vwAllLicensesWithAttributesAndSourceIdRepository.GetAll()
    .Where(x => x.SourceID == sourceId)
    .GroupBy(m => new {m.LicenseId, m.LicenseName})
    .Select(group =>
        new LicenseWithCharacteristicsModel
        {
            LicenseId = group.Key.LicenseId,
            LicenseName = group.Key.LicenseName,
            Characteristics = group.Select(m =>
                new CharacteristicModel
                {
                    Id = m.CharacteristicId,
                    Name = m.CharacteristicName
                }).ToList()
        });