Dapperでネストされたオブジェクトのリストをマップするには

dapper orm

質問

私は現在、dbアクセスのために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は私のためにマッピングを行いますので、私のCourseオブジェクトには場所のリストが取り込まれます。私は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を使用して、すべての結果を一度にヤンクすることもできます


人気のある回答

あるいは、検索で1つのクエリを使用することもできます。

var lookup = new Dictionary<int, Course>();
conn.Query<Course, Location, Course>(@"
                SELECT c.*, l.*
                FROM Course c
                INNER JOIN Location l ON c.LocationId = l.Id                    
                ", (c, l) => {
                     Course course;
                     if (!lookup.TryGetValue(c.Id, out course)) {
                         lookup.Add(c.Id, course = c);
                     }
                     if (course.Locations == null) 
                         course.Locations = new List<Location>();
                     course.Locations.Add(l); /* Add locations to course */
                     return course;
                 }).AsQueryable();
var resultList = lookup.Values;

こちらをご覧くださいhttps://www.tritac.com/blog/dappernet-by-example/



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ