2017-10-05 8 views
0

직장에서 우리는 Dapper을 사용하고 있습니다. 기존의 코드베이스에서는 마스터/디테일 오브젝트가 별도로로드됩니다. 일반적으로 이것은 모든 마스터 레코드에 대해 실행 된 하나의 SQL 문과 세부 레코드 당 하나의 SQL 문이 실행된다는 것을 의미합니다.Dapper가 전화를 건 후에 마스터/세부 레코드를 매핑하십시오.

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에서 도우미 메서드 또는 뭔가 있나요 : 성능을 개선하고 전환을 쉽게하기 위해

, 나는 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