0

バナー、パック、ファイルの3つのエンティティがあります。

1つのバナーには多くのパックがあり、1つのパックには多くのファイルがあります。

すべてのバナーのすべてのファイルIDを取得する必要があります。私は次のことを試しました:

  IList<BannerModel> banners = context.Banners
    .OrderBy(x => Guid.NewGuid())
    .Take(count)       
    .Select(x => 
      new BannerModel {
        Images = x.Packs.SelectMany(p => p.Files.Select(f => f.Id)).ToList()
      }).ToList();

ただし、ファイルIDの選択でエラーが発生します。

System.NotSupportedException:LINQ to Entitiesは、メソッド'System.Collections.Generic.List 1[System.Int32] ToList[Int32](System.Collections.Generic.IEnumerable1 [System.Int32])'メソッドを認識せず、このメソッドをストア式に変換できません。System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.DefaultTranslator.Translate(ExpressionConverter親、MethodCallExpression呼び出し)で...

何が間違っているのかについて何か考えはありますか?

注:遅延読み込みを無効にしました。

4

1 に答える 1

1
var allFileIDs = context.Banners.SelectMany(b => 
                           b.Packs.SelectMany(p => p.Files.Select(f => f.ID)))
                        .ToList();

結果のSQLは次のようになります。

SELECT [t2].[ID]
FROM [Banners] AS [t0], [Packs] AS [t1], [Files] AS [t2]
WHERE ([t1].[BannerID] = [t0].[ID]) AND ([t2].[PackID] = [t1].[ID])

遅延読み込みのない単一のクエリ。


すべてのファイルIDの取得に関する質問を誤解しました。各バナーをBannerModelに投影する必要がある場合:

context.Banners.Select(b => new BannerModel {
          Images = b.Packs.SelectMany(p => p.Files.Select(f => f.ID))
        }).ToList();

ToList()SQLに変換できない式が含まれているため、例外が表示されます。の代わりにBannerModel.Imagesタイプに変更し、selectステートメントから呼び出しを削除します。IEnumerable<int>List<int>ToList()


タイプを変更したくない場合のもう1つのオプションBannerModel.Images

context.Banners.Select(b => b.Packs.SelectMany(p => p.Files.Select(f => f.ID)))
               .ToList() // brings next projection into memory
               .Select(ids => new BannerModel { Images = ids.ToList() })
               .ToList();
于 2013-02-28T21:38:11.573 に答える