2014-10-30 21 views
17

Şu an için dapper.net'i kullanıyorum ve onunla çok iyi çalışan bir ORM mapper. Net dinamik tipleri var ama veriyi veritabanından alırken Dapper satır tipi olduğu zaman geri döndüğünü fark ettim. Ben herhangi bir şekilde iade edebilir herhangi bir şekilde System.Dynamic.ExpandoObject gibi mi?Dapper dinamik dönüş türleri

cevap

15

DapperRow nesnesi, satırlar arasında birçok durumu paylaşmak üzere tasarlanmıştır. Örneğin, 40 satırı alırsanız, sütun adları, yalnızca'da bir kez depolanır. ExpandoObject kullansaydık, bu satır başına yapılandırılması gerekirdi. Dolayısıyla, sahne arkası uygulama detayı olarak DapperRow kullanımı kasıtlı bir verimliliktir.

dynamic API'lerinden döndürülen nesnenin IDictionary<string,object> olarak da yayınlanabileceğini unutmayın. Bu sözlük kullanımını destekleyen diğer türlerini desteklemeye açık olacağım - bunların bir tanesi ExpandoObject.

var rows = conn.Query<ExpandoObject>(...); 

eser: Yani evet, bu şekilde değiştirilebilir. Sadece desteğini desteği gerektirir ve bu kod şu anda mevcut değildir. Yani "hayır, ama belki de gelecekte inşa".

Ayrıca, DapperRow'u kullanmanız gerekmediğini de unutmayın ... Daha fazla beklenen senaryosu, kendi türlerinizi gerçekleştirmek için genel API'yi kullanmaktır.

25

Elbette! Eğer bir dinamik nesne almak görebilir ve onlar iyi sorgu açıklamada tanımlandığı sürece özelliklerini erişebilir gibi

dynamic account = conn.Query<dynamic>(@" 
        SELECT Name, Address, Country 
        FROM Account 
      WHERE Id = @Id", new { Id = Id }).FirstOrDefault(); 
Console.WriteLine(account.Name); 
Console.WriteLine(account.Address); 
Console.WriteLine(account.Country); 

: şık belgeler gereğince

sizin dymanics sorgu yöntemi kullanmak ve almak .

.FirstOrDefault() numaralı bağlantı noktasını kullanırsanız, istediğiniz her şeyi yapabileceğiniz bir IEnumerable<dynamic> elde edersiniz.

8

Bu sorunu yaşıyorum ve bu şekilde çözdüm!

Query() işlevi, aslında altındaki Dapper.SqlMapper.DapperRow nesne türünde bir dizi dinamik döndürür. Dapper.SqlMapper.DapperRow özeldir. Dapper.SqlMapper.DapperRow nesnelerine dinamik olarak özellikler eklemem gerekiyordu, ancak bu işe yaramaz. Sonuç olarak, Dapper.SqlMapper.DapperRow'u ExpandoObject'a dönüştürmek istedim.

Bu genel yardımcı yöntemini aşağıdaki gibi oluşturabiliyordum.

public class DapperHelpers 
{ 
    public static dynamic ToExpandoObject(object value) 
    { 
     IDictionary<string, object> dapperRowProperties = value as IDictionary<string, object>; 

     IDictionary<string, object> expando = new ExpandoObject(); 

     foreach (KeyValuePair<string, object> property in dapperRowProperties) 
      expando.Add(property.Key, property.Value); 

     return expando as ExpandoObject; 
    } 
} 

Sonra böyle olduğunu kullanabilirsiniz:

IEnumerable<ExpandoObject> result = 
      db.SqlConn.Query(sqlScript) 
       .Select(x=> (ExpandoObject)ToExpandoObject(x)); 

referans: Biz açıkça nesneyi EXPANDO için şık satır dönüştürmek gerekiyor, doğru bir yaklaşım aşağıdaki aracılığıyla aktarılabilecek neden dapper-dot-net issues 166

+1

? var satırlar = conn.Query (...); –

+1

Belki de Dapper'ın sonraki sürümünde çalışıyorum ancak sürüm 1.4'te kullandım, bu dönüştürülmüş nesnenin hiçbir özelliği yok. Bu çözümü dapper sorunlarından buldum. – Behzad