1. ホーム
  2. orm

[解決済み] Dapperでネストされたオブジェクトのリストをマッピングする方法

2022-04-29 06:48:41

質問

現在、データベースへのアクセスにEntity Frameworkを使用していますが、Dapperを見てみたいと思っています。このようなクラスがあります。

public class Course{
   public string Title{get;set;}
   public IList<Location> Locations {get;set;}
   ...
}

public class Location{
   public string Name {get;set;}
   ...
}

つまり、1つのコースを複数の場所で教えることができるのです。Entity Frameworkは私のためにマッピングを行うので、私のコースオブジェクトは場所のリストで入力されます。Dapperでどのようにこれを行うのでしょうか?それは可能なのでしょうか、それともいくつかのクエリステップで行う必要があるのでしょうか?

どのように解決するのですか?

Dapperは本格的なORMではないので、クエリなどのマジック生成は行いません。

あなたの特定の例では、おそらく次のように動作します。

コースを取得します。

var courses = cnn.Query<Course>("select * from Courses where Category = 1 Order by CreationDate");

関連するマッピングを取得する。

var mappings = cnn.Query<CourseLocation>(
   "select * from CourseLocations where CourseId in @Ids", 
    new {Ids = courses.Select(c => c.Id).Distinct()});

関連する場所を取得する

var locations = cnn.Query<Location>(
   "select * from Locations where Id in @Ids",
   new {Ids = mappings.Select(m => m.LocationId).Distinct()}
);

マップを作成する

読者に任せて、いくつかのマップを作成し、コースに場所を入力することを繰り返します。

注意事項 その in が少ない場合は、このトリックは有効です。 2100 ルックアップ(Sql Server)、それ以上の場合は、クエリを次のように修正します。 select * from CourseLocations where CourseId in (select Id from Courses ... ) この場合、すべての結果を一度に取り出すには、次のようにします。 QueryMultiple