我能从Dapper查询中获取字段结构吗?

3

我一直在查看源代码,但对于这样一个小型ORM,其中有相当多的内容。在调用.Query()后,是否有任何方法可以检索由Dapper返回的查询的字段结构?本质上,当调用GetSchemaTable()时,我需要与DataReader返回的数据相同。

1个回答

3
这可以通过以下方式来完成:
使用以下任一调用方法之一获取读取器:
IDataReader dr = _connection.ExecuteReader(sql)

或者

IDataReader dr = _connection.GetStream(sql)

现在你可以调用dr.GetSchemaTable()来获取相关模式的DataTable。实际上,如果你想利用GetSchemaTable()的重载,你可以将它强制转换为相应的DbDataReader类型,比如SqlDataReader或OracleDataReader

那么,你如何将它实现为IEnumerable<dynamic>或特定类型呢? - Paul Mrozowski
不确定您是否有通过DataReader创建IEnumerable<T>的特定要求,因为可以直接使用Dapper Query<T>调用来获取它。如果需要从DataReader进行转换,则需要使用Reflection,请参阅以下链接-http://www.codeproject.com/Articles/827984/Generically-Populate-List-of-Objects-from-SqlDataR 重点是,创建一个实体,应用属性以映射到从数据库中获取的列名称,然后使用每个DataReader.Read()调用填充对象的每个属性。 - Mrinal Kamboj
但这正是使用Dapper的目的 - 我希望它做映射。我只是恰好需要获取结果元数据。我想要进行.Query()或.Query<>调用,然后检索有关此结果的元数据。是的,我可以手动完成所有这些工作,但如果可能的话我宁愿不这样做(因此提出了问题)。 - Paul Mrozowski
Dapper作为一种微型ORM,在许多常见的情况下非常有用,它可以无需额外配置就支持获取Poco、一对一映射和一对多映射,使其成为一个很好的微型ORM。然而,并非所有预期的使用情况都被默认支持。在使用Query<T>语法时获取模式的情况通常不存在,但您可以要么询问相同的问题@ https://github.com/StackExchange/dapper-dot-net/issues 或者计划修改Dapper代码以公开必要的API。 - Mrinal Kamboj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接