2017-10-05 62 views
0

在工作中,我們正在考慮使用Dapper。在現有的代碼庫中,我們的主/明細對象是分開加載的。通常,這意味着有一個sql語句針對所有主記錄執行,一個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的東西嗎?或者有更好的方法來實現這個(比foreach循環)使用.NET庫?

回答

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