2011-05-19 11 views
7
var sql = @"SELECT 
    a.id AS `Id`, 
    a.thing AS `Name`, 
    b.id AS `CategoryId`, 
    b.something AS `CategoryName` 
FROM .."; 

var products = connection.Query<Product, Category, Product>(sql, 
    (product, category) => 
    { 
     product.Category = category; 
     return product; 
    }, 
    splitOn: "CategoryId"); 

foreach(var p in products) 
{ 
    System.Diagnostics.Debug.WriteLine("{0} (#{1}) in {2} (#{3})", p.Name, p.Id, p.Category.Name, p.Category.Id); 
} 

Sonuçlar:Dapper'da çoklu eşleme desteği için sütunlar nasıl adlandırılır? içinde

'First (#1) in (#0)' 
'Second (#2) in (#0)' 
Kategori Kimliği ve CategoryName aşağıdaki

var products = connection.Query(sql).Select<dynamic, Product>(x => new Product 
{ 
    Id = x.Id, 
    Name = x.Name, 
    Category = new Category { Id = x.CategoryId, Name = x.CategoryName } 
}); 

Sonuçlar beri değerlere sahiptir

: Ben eğer MySQL veritabanına bağlıyorum

'First (#1) in My Category (#10)' 
'Second (#2) in My Category (#10)' 

onunla bir ilgisi var.

+0

Burada spliton kullanıyorsunuz, google kodunda izleyiciye bozuk bir test göndermeyi düşünüyor musunuz? –

+0

@Sam Tahmin ediyorum, '' CategoryName '' '' '' '' '' '' '' '' '' '' değiştirmiş olsaydım çalışmalıydım. Dapper'ın '' CategoryName '' (aynı zamanda 'Category.Name' 'i denen)' 'x.Category.Name' ' – loraderon

+0

' 'ile eşlemek için bazı automapper kurallarını kullanacağı izlenimi uyandırıyordum. Kategorinin tüm bölümlerine ... aslında sonuç kümesindeki çift sütun adlarını işlemek daha basit. o zaman sen-ebilmek yapmak gibi şeyler * Gönderen Gönderiler p katılmak Yazarlar a p.AuthorId = a.Id' çok özlü olan –

cevap

9

En basit yol, tüm Id (büyük/küçük harf duyarsız, yani sadece a.id ve b.id iyi) aramak; o zaman kullanabilirsiniz: Bunu yapamıyorsan

public void TestMultiMapWithSplit() 
    { 
     var sql = @"select 1 as Id, 'abc' as Name, 2 as Id, 'def' as Name"; 
     var product = connection.Query<Product, Category, Product>(sql, 
      (prod, cat) => 
      { 
       prod.Category = cat; 
       return prod; 
      }).First(); 
     // assertions 
     product.Id.IsEqualTo(1); 
     product.Name.IsEqualTo("abc"); 
     product.Category.Id.IsEqualTo(2); 
     product.Category.Name.IsEqualTo("def"); 
    } 

, bölünme de tedavi etmek için sütunlar virgülle ayrılmış listesini alır isteğe bağlı bir splitOn (string) parametresi vardır.

+0

Asla bu kadar kolay olacağını düşündüm! Teşekkürler! – loraderon

+0

@loraderon son derece tembeliz ve kullanımı kolay şeyler yazıyoruz, p –

İlgili konular