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