如何返回动态类型List<;动态>;使用Dapper ORM

本文关键字:动态 lt 使用 ORM Dapper gt 类型 何返回 返回 List | 更新日期: 2023-09-27 18:28:25

我已经使用Dapper.net一段时间了,它是一个非常好的ORM映射器,非常适合.net动态类型。

但我注意到,当Dapper从数据库中检索数据时,它会以DapperRow类型返回。

有没有什么方法可以让我以任何其他类型返回它,比如System.Dynamic.ExpandoObject

如何返回动态类型List<;动态>;使用Dapper ORM

当然!

根据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