2013-06-11 11 views
9

Używam wielu mapowań dla bieżącego zapytania, a teraz muszę odwzorować inny obiekt na początkowe zapytanie.Dapper Multi-map następny poziom

Na przykład:

public class Part { 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public Address Address { get; set; } 

} 

public class Address { 
    public int Id { get; set; } 
    public string Street { get; set; } 

    public SiteOu Ou { get; set; } 
} 

public class SiteOu 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

Wytworny:

connection.Query<Part, Address, Part>(sql, (part, address) => { 
    part.Address = address; 
    }); 

Jak uzyskać klasę adresową, aby mieć informacje SiteOu?

Ten przykład nie jest to, co ja rzeczywiście robi bo ja rzeczywiście dostał

Query<T1,T2,T3,T4,T5,TResult>(); 

robię 1 Wybierz i 5 łączy w moim zapytaniu. Mam więc nadzieję, że nie potrzebuję więcej przeciążeń Query.

Odpowiedz

12

Dapper pozwala zmapować pojedynczy wiersz do wielu obiektów, dzięki czemu można po prostu zamapować SiteOu jako część tego samego zapytania.

[Test] 
public void TestSplitOn() 
{ 
    var conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;Integrated Security=true;Initial Catalog=db"); 
    conn.Open(); 
    const string sql = "select Id = 1, Name = 'My Part', " + 
         "Id = 2, Street = 'My Street', " + 
         "Id = 3, Name = 'My Site'"; 
    var result = conn.Query<Part, Address, SiteOu, Part>(sql, (part, address, siteOu) => 
    { 
     part.Address = address; 
     address.Ou = siteOu; 
     return part; 
    }, 
    commandType: CommandType.Text 
    ).FirstOrDefault(); 

    Assert.That(result, Is.Not.Null); 
    Assert.That(result.Address, Is.Not.Null); 
    Assert.That(result.Address.Ou, Is.Not.Null); 
} 

Ważna uwaga: Dapper zakłada kolumnach Id są nazwane „id” lub „id”, jeśli klucz podstawowy jest inny lub chcesz podzielić szeroki wiersz w punkcie innym niż „id”, użyj opcjonalny parametr "splitOn".

Jeśli masz więcej niż 5 typów do mapowania, inną z opcji skrzynki jest użycie rozszerzenia QueryMultiple Oto przykład z dokumentacji Dappera.

var sql = 
@" 
select * from Customers where CustomerId = @id 
select * from Orders where CustomerId = @id 
select * from Returns where CustomerId = @id"; 

using (var multi = connection.QueryMultiple(sql, new {id=selectedId})) 
{ 
    var customer = multi.Read<Customer>().Single(); 
    var orders = multi.Read<Order>().ToList(); 
    var returns = multi.Read<Return>().ToList(); 
    ... 
} 

Sprawdź również to thread.

+0

Obawiałem się, że to była odpowiedź. Problem polega na tym, że mam 5 sprzężeń, więc przesłonięcie Query jest krótkie dla mojego scenariusza. Przykład, o którym wspomniałem, to uproszczona wersja tego, co naprawdę mam. Mój obiekt częściowy ma naprawdę kilka dodatkowych właściwości, dostawcę, model itd ... –

+0

Tak, niestety, Dapper obsługuje tylko do 5 typów. Inną opcją z pudełka byłoby użycie rozszerzenia QueryMultiple. Dodałem przykład z dokumentów Dappera do odpowiedzi. –

+3

@ KyleRogers zaktualizowałeś aplikację do aktualnej wersji? Widzę 'Zapytanie '? –