我已经使用Dapper.net一段时间了,它是一个非常好的ORM映射器,可以很好地与.Net动态类型一起使用。
但是我注意到,当Dapper从数据库检索数据时,它以DapperRow
类型返回。
有什么方法可以像System.Dynamic.ExpandoObject
这样的其他任何类型返回它?
DapperRow
对象旨在在行之间共享很多状态。例如,如果您获取40行,则列名等仅存储一次 。如果我们使用ExpandoObject
,则需要按行进行配置。因此,将DapperRow
用作幕后实现细节是故意的提高效率。
请注意,从dynamic
API返回的对象也可以转换为IDictionary<string,object>
。
但是,我愿意支持其他支持此字典用法的类型ExpandoObject
是其中之一。所以是的, 可以将其更改为:
var rows = conn.Query<ExpandoObject>(...);
作品。它仅需要代码来支持它,并且该代码当前不存在。因此,“不,但也许在将来的构建中”。
另请注意,您根本不需要使用DapperRow
。更期望的方案是使用通用API来实现您自己的类型。
当然!
根据dapper文档,使用query方法并获取动态信息:
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>
,您可以使用它执行任何操作。