2013-06-11 23 views
9

Geçerli bir sorgu için birden çok eşleme kullanıyorum ve şimdi ilk sorgudaki başka bir nesneyi eşleştirmem gerekiyor. ÖrneğinDapper Çoklu harita sonraki seviye

:

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

Zarif:

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

nasıl SiteOu bilgi sahibi olmak Adres sınıfını alabilirim?

Bu örnek Aslında ben seçme 1 yapıyorum ve 5 benim sorgudaki birleşimler

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

var çünkü ben aslında ne yapıyorum değildir. Yani umarım daha fazla sorguya ihtiyacım yok.

cevap

12

Dapper, tek bir satırı birden çok nesneye eşlemenize olanak sağlar, böylece aynı sorgunun bir parçası olarak SiteOu'yu eşleyebilirsiniz.

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

Önemli Not: Birincil anahtar farklıysa veya "Id" dışında bir noktada geniş satır bölmek istiyorsanız Dapper sizin Kimliği sütunları "kimliği" veya "id" adlı varsayar, kullanmak isteğe bağlı 'splitOn' parametresi.

Haritaya daha fazla 5 türünüz varsa, başka bir kutudan çıkma seçeneği QueryMultiple uzantısını kullanmaktır. İşte Dapper belgelerinden bir örnek.

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

Ayrıca, bu thread göz atın.

+0

Bu cevaptan korkuyordum. Sorun 5 eklemim var, ve bu yüzden Sorgu geçersiz kılma benim senaryo için bir kısa. Bahsettiğim örnek, gerçekten sahip olduğum şeyin basitleştirilmiş bir versiyonuydu. Benim parçası nesne gerçekten birkaç özellik, satıcı, model, vb var ... –

+0

Evet, ne yazık ki Dapper sadece 5 tür destekler. Kutu seçeneğinin dışında bir başka QueryMultiple uzantısını kullanmak olabilir. Dapper’ın dokümanlarından yanıtın bir örneğini ekledim. –

+3

@KyleRogers dapper'ı güncel sürüme güncellediniz mi? Sorguyu görüyorum. '? –