0

タイトルが示すように、Linq-To-SQL で選択サブクエリを実行しようとしています。これが私の状況です:

次のフィールドを返すデータベース ビューがあります。

  • ソース ID
  • ライセンス ID
  • ライセンス名
  • 特性 ID
  • 特性名

これを、次のプロパティを持つ私のモデルに保存できるようにしたい

  • ID
  • 名前
  • 特性 (これは ID、名前、アイコンを持つリストです => アイコンは 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 つのクエリでこれを実行しようとしていますが、ちょっと行き詰まっています。

4

1 に答える 1

1

サンプルのクエリとモデルはそれほど一貫性がありません(どこIconから来たのか、CharacteristicsまたはCharacteristicList)が、とにかく。

私はこれを2つの部分で行います。もちろん、これを1つのクエリで再グループ化することもできます。グループ化後に結果を列挙します。列挙せずに実行しようとする場合があります(すべて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()
        });
于 2012-10-04T10:07:57.953 に答える