Я использую dapper.net для сейчас, и это очень хороший ORM-конвертер, который отлично работает с динамическими типами .Net, но я заметил, что когда dapper извлекает данные из базы данных, он возвращается, поскольку тип строки Dapper существует каким образом я могу вернуть его в любой другой тип, например System.Dynamic.ExpandoObject?Типы динамического возврата Dapper
ответ
Объект DapperRow
предназначен для разделения большого количества состояний между строками. Например, если вы получаете 40 строк, имена столбцов и т. Д. Сохраняются только после. Если мы использовали ExpandoObject
, это нужно было бы настроить для каждой строки. Следовательно, использование DapperRow
в качестве детали реализации закулисных предметов является преднамеренной эффективностью.
Обратите внимание, что объект, возвращенный из API dynamic
, также может быть отлит как IDictionary<string,object>
.
Я бы, однако, был открыт для поддержки других типов, поддерживающих использование этого словаря, из которых ExpandoObject
является одним из них. Так что да, это может быть изменен таким образом, что:
var rows = conn.Query<ExpandoObject>(...);
работы. Он просто требует кода для поддержки его, и этот код в настоящее время не существует. Так что «нет, но, возможно, в будущем строить».
Обратите внимание, что вам необязательно использовать DapperRow
... Более ожидаемый сценарий - использовать общий API для материализации ваших собственных типов.
Конечно!
Согласно щеголеватый документации используется метод запроса и получить 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>
, с помощью которого вы можете делать все, что хотите.
У меня есть эта проблема, и я решил так!
Функция 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. Ошибка возврата запроса Dapper
- 2. Процедура создания динамического объекта для Dapper
- 3. Добавление динамического выходного параметра Dapper в VB.NET
- 4. Поддержка Dapper Пространственные типы .net Core
- 5. Использование Dapper QueryAsync для возврата одного объекта
- 6. Типы возврата к перегрузке?
- 7. Несовместимые типы для возврата
- 8. Типы возврата WCF
- 9. Типы возврата WCF
- 10. Быстрые типы возврата
- 11. Freebase searchAPI типы возврата
- 12. динамического возврата запроса нулевое значение
- 13. Множественные типы возврата по методу
- 14. Полиморфные типы возврата в MATLAB
- 15. Типы возврата литья WCF Auto?
- 16. Типы возврата в Racket \ Scheme
- 17. Типы возврата и множественное наследование?
- 18. Произвольные типы возврата весной mvc
- 19. Полиморфные типы возврата в C++
- 20. Динамические типы возврата через java generics
- 21. Приведение родоначальника для возврата объекта динамического типа
- 22. проект динамического Dapper результатов без учета некоторых свойств
- 23. Использование динамического списка объектов в запросах соединения dapper
- 24. Преобразование динамического объекта в dapper Запрос <dynamic>
- 25. Spring: Использование @ Конфигурация для динамического возврата Bean
- 26. Объект c метод для возврата динамического типа
- 27. Функция номер возврата с помощью динамического sql
- 28. Построение динамического linq Func для возврата строки
- 29. Каково использование возврата динамического значения в C#
- 30. Тип: полиморфные типы возврата в базовом классе?
почему мы должны преобразовать щеголеватый строку EXPANDO объект явно, это конвертируемая через следующий подход правильно? var rows = conn.Query (...); –
Возможно, в следующей версии Dapper, которая работает правильно, но в версии 1.4, которую я использовал, это преобразованный объект не имеет никакого свойства. Я нашел это решение из проблем с dapper. – Behzad