2017-10-05 6 views
0

Dapperの使用を検討中です。既存のコードベースでは、マスタ/ディテールオブジェクトは個別にロードされます。通常、これは、すべてのマスター・レコードに対して1つのSQL文が実行され、詳細レコードごとに1つのSQL文が実行されることを意味します。Dapperコール後のマスター/詳細レコードのマップ

パフォーマンスを改善し、移行を容易にするために、私はDapperを使用して2つの呼び出しを行うと一緒に結果をステッチしたいと思います:

public class Zoo 
{ 
    Guid Id { get; set; } 
    string Name { get; set;} 
    IList<Monkey> Monkeys { get; set; } 
} 

public class Monkey 
{ 
    Guid Id { get; set; } 
    Guid ZooId { get; set; } 
    string Name { get; set; } 
    bool DeservesBanana { get; set; } 
} 

var sqlZoos = "SELECT * FROM Zoos" 
var Zoos = connection.Query(sqlZoos) 

var sqlMonkeys = "SELECT * FROM Monkeys" 
var Zoos = connection.Query(sqlZoos) 

foreach(var zoo in Zoos) 
{ 
    zoo.Monkeys = Monkeys.Where(x => x.ZooId = zoo.Id).ToList(); 
} 

私は置き換えに使用することができますDapperでヘルパーメソッドか何かがありますforeach。代わりにAutoMapperのようなものを使うべきですか?または、.NETライブラリを使用してこれを実現するより良い方法がありますか(foreachループよりも)ですか?

答えて

0

あなたはこのような何かを試みることができる。このため

var zoos = new Dictionary<string, Zoo>(); 
var query = "SELECT * FROM Zoos LEFT OUTER JOIN Monkeys ON Monkeys.ZooId = Zoos.Id"; 

_connection.Query<Zoo, Monkey, Zoo>(query, (z, m) => 
{ 
    if (!zoos.TryGetValue(z.Id, out Zoo zoo)) 
     zoos.Add(z.Id, zoo = z); 

    zoo.Monkeys.Add(m); 
    return zoo; 
}); 
+0

感謝を。最終的に、私は単一のSELECT文を実行するためにコードを書き直したいと思います。しかし、書き直す必要のある_lot_コードがあります。複数の問い合わせの後にデータをつなぎ合わせる最も簡単な方法を考案すれば、最小量の摩擦で「Dapper」を導入することができます – Mitkins

関連する問題