ActiveRecord 自定义 SQL 结果自动映射

Posted

技术标签:

【中文标题】ActiveRecord 自定义 SQL 结果自动映射【英文标题】:ActiveRecord custom SQL result automapping 【发布时间】:2011-03-11 20:20:56 【问题描述】:

在 Castle ActiveRecord 中,我使用 session.CreateSQLQuery(MyQueryString).List() 查询数据库

当查询的结果列与我的任何数据库表的字段没有 100% 匹配时,我无法使用基于 ActiveRecord 的类将结果自动映射到强类型对象中。

有没有办法将临时查询的结果映射到自定义类型(可能通过我的目标类上的 ActiveRecord 属性?)而不必在查询执行/处理代码中逐个字段映射?我在想类似的事情:

MyQueryResultType[] results = session.CreateSQLQuery(MyQueryString).List().MapFieldsAs<MyQueryResultType>();

【问题讨论】:

【参考方案1】:

我有一段时间没有使用 ActiveRecord,但据我记得,它在下面使用 NHibernate,它可以处理这个问题。以下是无耻地从another Stack Overflow question/answer盗取的代码:

IList<MyObj> reults = Session.CreateQuery("select r.feedname as feedname, count(r.feedurl) as feedcount from rsssubscriptions r group by r.feedname")
                                                .SetResultTransformer(NHibernate.Transform.Transformers.AliasToBean(typeof(MyObj)))
                                                .List<MyObj>();

虽然没有“MapFieldAs”函数,但有一个“SetResultTransformer”函数。此函数允许您传递一个对象,该对象描述了从数据库中取回结果后应执行的操作。为了告诉查询获取数据并将列映射到强类型对象列表,您必须定义一个执行此操作的转换器对象。幸运的是,NHibernate 还有一个可以使用的通用转换器对象 (NHibernate.Transform.Transformers.AliasToBean)。

这里有一些关于堆栈溢出的答案以及示例:

NHibernate: returning a strongly typed list having applied an aggregate function

Using Unmapped Class with NHibernate Named Query

【讨论】:

以上是关于ActiveRecord 自定义 SQL 结果自动映射的主要内容,如果未能解决你的问题,请参考以下文章

通过扩展向 ActiveRecord 模块添加自定义验证?

ruby 与缓存和预加载的自定义关系(ActiveRecord)

如何设置自定义ActiveRecord关联?

用于 ActiveRecord_Relation 的 Rails 未定义方法“sanitize_sql_array”

sqlserver自定义函数里面 怎么循环查询多条结果集

SQL Server 在查询结果增加自定义的三个字段?如何搞?