151

現在、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でこれをどのように処理しますか?それは可能ですか、それともいくつかのクエリステップで実行する必要がありますか?

4

8 に答える 8

204

または、ルックアップで 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/

于 2013-07-19T14:33:09.683 に答える
58

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()}
);

すべてをマッピングする

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

ルックアップが2100in未満(SQL Server)の場合は、このトリックが機能することに注意してください。ルックアップが2100未満の場合は、クエリを修正する必要があります。その場合は、すべての結果を一度にヤンクすることもできます。select * from CourseLocations where CourseId in (select Id from Courses ... )QueryMultiple

于 2011-09-23T01:18:34.880 に答える
6

何かが欠けています。LocationsSQL クエリで各フィールドを指定しないと、オブジェクトLocationを埋めることができません。見てみましょう:

var lookup = new Dictionary<int, Course>()
conn.Query<Course, Location, Course>(@"
    SELECT c.*, l.Name, l.otherField, l.secondField
    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(a);
        return course;
     },
     ).AsQueryable();
var resultList = lookup.Values;

クエリで使用l.*すると、場所のリストがありましたが、データはありませんでした。

于 2014-02-14T14:16:43.723 に答える