2014-10-30 27 views
17

Używam dapper.net już teraz i jest to bardzo dobry program odwzorowujący ORM, który świetnie współpracuje z dynamicznymi typami .Net, ale zauważyłem, że gdy dapper pobiera dane z bazy danych, zwraca się, gdy typ wiersza Dappera jest są w jaki sposób mogę zwrócić go w dowolnym innym typie Like System.Dynamic.ExpandoObject?Dynamiczny typ powrotu Dappera

Odpowiedz

15

Obiekt DapperRow jest przeznaczony do dzielenia wielu stanów między wierszami. Na przykład, jeśli pobierzesz 40 wierszy, nazwy kolumn itp. Są przechowywane tylko raz. Jeśli użyjemy ExpandoObject, będzie to musiało być skonfigurowane dla każdego wiersza. W związku z tym użycie DapperRow jako szczegółów implementacji zza kulis jest celową sprawnością.

Należy pamiętać, że obiekt zwracany z interfejsów API dynamic może być również przesyłany jako IDictionary<string,object>.

Byłbym jednak otwarty na wspieranie innych typów, które obsługują to użycie słownika - którego jednym z nich jest ExpandoObject. Więc tak, to mógłby być zmieniony tak, że:

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

prace. Wymaga po prostu kodu do wsparcia, a ten kod obecnie nie istnieje. Więc "nie, ale być może w przyszłej kompilacji".

W ogóle nie trzeba używać DapperRow ... Im więcej oczekuje się scenariusza , aby użyć typowego interfejsu API do zmaterializowania własnych typów.

25

Oczywiście!

Zgodnie Wytworny dokumentacji użyć metody zapytań i uzyskać dymanics:

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

Jak widać można uzyskać obiekt dynamiczny i można uzyskać dostęp do jego właściwości, o ile są one dobrze zdefiniowane w rachunku zapytania .

Jeśli anulujesz .FirstOrDefault(), otrzymasz numer IEnumerable<dynamic>, dzięki któremu możesz zrobić, co tylko zechcesz.

8

Mam ten problem i rozwiązałem go w ten sposób!

Funkcja Query() zwraca kolekcję dynamiki, które pod spodem są w rzeczywistości typami obiektów Dapper.SqlMapper.DapperRow. Dapper.SqlMapper.DapperRow jest prywatny. Musiałem dynamicznie dodawać właściwości do obiektów Dapper.SqlMapper.DapperRow, ale wydaje się, że to nie działa. W rezultacie chciałem przekonwertować Dapper.SqlMapper.DapperRow na ExpandoObject.

udało mi się zbudować ten rodzajowy metody pomocnika jak poniżej.

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

Następnie można użyć, że tak:

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

referencyjny: dapper-dot-net issues 166

+1

dlaczego mamy do konwersji Wytworny wiersz EXPANDO obiekt wyraźnie, że jest convertable poprzez następujące podejścia prawda? var rows = conn.Query (...); –

+1

Może w następnej wersji Dappera, która działa poprawnie, ale w wersji 1.4, której użyłem, ten skonwertowany obiekt nie ma żadnej właściwości. Znalazłem to rozwiązanie z ciekawszych problemów. – Behzad

Powiązane problemy