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 结果自动映射的主要内容,如果未能解决你的问题,请参考以下文章
ruby 与缓存和预加载的自定义关系(ActiveRecord)