如何返回动态类型List<;动态>;使用Dapper ORM
本文关键字:动态 lt 使用 ORM Dapper gt 类型 何返回 返回 List | 更新日期: 2023-09-27 18:28:25
我已经使用Dapper.net一段时间了,它是一个非常好的ORM映射器,非常适合.net动态类型。
但我注意到,当Dapper从数据库中检索数据时,它会以DapperRow
类型返回。
有没有什么方法可以让我以任何其他类型返回它,比如System.Dynamic.ExpandoObject
?
当然!
根据dapper文档,使用查询方法并获取您的动态:
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>
,你可以用它做任何你想做的事情
DapperRow
对象被设计为在行之间共享许多状态。例如,如果获取40行,则列名等只存储一次。如果我们使用ExpandoObject
,则需要按行进行配置。因此,使用DapperRow
作为幕后实现细节是一件有意提高效率的事情。
请注意,从dynamic
API返回的对象也可以强制转换为IDictionary<string,object>
。
然而,我愿意支持其他支持这种字典用法的类型,ExpandoObject
就是其中之一。因此,是的,它可以更改为:
var rows = conn.Query<ExpandoObject>(...);
工作。它只需要支持它的代码,而该代码目前并不存在。所以"没有,但也许在未来的构建中"。
还要注意,您根本不需要使用DapperRow
。。。更多的预期场景是使用通用API来实现您自己的类型。
我有这个问题,我用这种方法解决了!
Query()
函数返回一组动力学,这些动力学实际上是Dapper.SqlMapper.DapperRow
对象类型。Dapper.SqlMapper.DapperRow
是私有的。我需要向Dapper.SqlMapper.DapperRow对象动态添加属性,但这似乎不起作用。因此,我想将Dapper.SqlMapper.DapperRow
转换为ExpandoObject
。
我能够像下面这样构建这个通用的helper方法。
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发布166