Dapper动态返回类型

我一直在使用dapper.net,它是一个非常好的ORM映射器,它与.Net动态类型很有效但我注意到当dapper从数据库中检索数据时它返回Dapper行类型是否有任何方式我可以返回它在任何其他类型像System.Dynamic.ExpandoObject?

DapperRow对象旨在共享行之间的大量状态。 例如,如果您获取40行,则列名等仅存储一次 。 如果我们使用ExpandoObject ,则需要每行配置一次。 因此,使用DapperRow作为幕后实现细节是一种刻意的效率。

请注意,从dynamic API返回的对象也可以转换为IDictionary

但是,我会支持其他支持这种字典用法的类型 – ExpandoObject就是其中之一。 所以是的, 可以改变它:

 var rows = conn.Query(...); 

作品。 它只需要代码来支持它,并且该代码当前不存在。 所以“不,但也许在未来的构建中”。

另请注意,您根本不需要使用DapperRow …更期望的情况是使用通用API来实现您自己的类型。

当然!

根据dapper文档使用查询方法并获得你的动态:

 dynamic account = conn.Query(@" 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 ,你可以用它做任何你想做的事情。

我有这个问题,我这样解决了!

Query()函数返回一个动态集合,其下面实际上是Dapper.SqlMapper.DapperRow对象类型。 Dapper.SqlMapper.DapperRow是私有的。 我需要动态地向Dapper.SqlMapper.DapperRow对象添加属性,但这似乎不起作用。 因此,我想将Dapper.SqlMapper.DapperRow转换为ExpandoObject

我能够像下面这样构建这个通用的帮助方法。

 public class DapperHelpers { public static dynamic ToExpandoObject(object value) { IDictionary dapperRowProperties = value as IDictionary; IDictionary expando = new ExpandoObject(); foreach (KeyValuePair property in dapperRowProperties) expando.Add(property.Key, property.Value); return expando as ExpandoObject; } } 

然后你就可以这样使用:

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

参考: dapper-dot-net问题166