2014-10-30 2 views
17

Я использую dapper.net для сейчас, и это очень хороший ORM-конвертер, который отлично работает с динамическими типами .Net, но я заметил, что когда dapper извлекает данные из базы данных, он возвращается, поскольку тип строки Dapper существует каким образом я могу вернуть его в любой другой тип, например System.Dynamic.ExpandoObject?Типы динамического возврата Dapper

ответ

15

Объект DapperRow предназначен для разделения большого количества состояний между строками. Например, если вы получаете 40 строк, имена столбцов и т. Д. Сохраняются только после. Если мы использовали ExpandoObject, это нужно было бы настроить для каждой строки. Следовательно, использование DapperRow в качестве детали реализации закулисных предметов является преднамеренной эффективностью.

Обратите внимание, что объект, возвращенный из API dynamic, также может быть отлит как IDictionary<string,object>.

Я бы, однако, был открыт для поддержки других типов, поддерживающих использование этого словаря, из которых ExpandoObject является одним из них. Так что да, это может быть изменен таким образом, что:

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

работы. Он просто требует кода для поддержки его, и этот код в настоящее время не существует. Так что «нет, но, возможно, в будущем строить».

Обратите внимание, что вам необязательно использовать DapperRow ... Более ожидаемый сценарий - использовать общий API для материализации ваших собственных типов.

25

Конечно!

Согласно щеголеватый документации используется метод запроса и получить 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); 

Как вы можете видеть, вы получаете динамический объект, и вы можете получить доступ к его свойства до тех пор, как они хорошо определены в инструкции запроса ,

Если вы омываете .FirstOrDefault(), вы получаете номер IEnumerable<dynamic>, с помощью которого вы можете делать все, что хотите.

8

У меня есть эта проблема, и я решил так!

Функция Query() возвращает коллекцию динамики, которая на самом деле составляет Dapper.SqlMapper.DapperRow типов объектов. Dapper.SqlMapper.DapperRow является закрытым. Мне нужно было динамически добавлять свойства к объектам Dapper.SqlMapper.DapperRow, но это не работает. В результате я хотел преобразовать Dapper.SqlMapper.DapperRow в ExpandoObject.

Я смог создать этот общий вспомогательный метод, как показано ниже.

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

Затем вы можете использовать это так:

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

ссылка: dapper-dot-net issues 166

+1

почему мы должны преобразовать щеголеватый строку EXPANDO объект явно, это конвертируемая через следующий подход правильно? var rows = conn.Query (...); –

+1

Возможно, в следующей версии Dapper, которая работает правильно, но в версии 1.4, которую я использовал, это преобразованный объект не имеет никакого свойства. Я нашел это решение из проблем с dapper. – Behzad

Смежные вопросы