【发布时间】:2012-06-19 20:25:25
【问题描述】:
到目前为止(使用 NHibernate)我已经使用了实体映射,并没有真正参与创建原始 sql 查询 - 但有些事情需要我做。
我的问题是我想自动将查询的列别名映射到 Dto 对象。
这可行,但我必须按查询顺序指定列别名'。
SQL
string sql = "select mycol1 as ColumnOne from mytable";
NHibernate 查询
var query = session.CreateSQLQuery(sql)
.AddScalar("ColumnOne", NHibernateUtil.Int32)
.SetResultTransformer(
NHibernate.Transform.Transformers.AliasToBean<MyDtoObject>()
);
MyDtoObject
public class MyDtoObject
{
public int ColumnOne {get;set;}
}
但是有没有一种方法可以让 NHibernate 在不创建映射类的情况下自动执行查询中的列和 Dto 之间的映射?
我见过一些在查询中使用别名的例子,例如
string sql = "select mycol1 as {ColumnOne} as ColumnOne from mytable"; /// ???
但无法使其正常工作,因为别名 {ColumnOne} 在作为 sql 语句发送到数据库之前似乎没有被替换。
有什么想法吗?
TIA
山姆
【问题讨论】:
-
我不完全确定您在这里追求什么 - 您是否试图让 NHibernate 猜测 DB 列“mycol1”应该最终出现在 DTO 的 ColumnOne 中而没有明确告诉它?我不明白这怎么可能。
-
不,只使用别名来映射 poco 对象。我实际上已经通过在别名周围加上双引号实际上正确映射了它。
select col1 "ColumnOne" from mytable有效,我现在处理的问题是数据库中的整数作为十进制返回,当分配给“MyDtoObject”的 int 属性时会引发异常。 System.Decimal 类型不能分配给 System.Int32 类型的属性 -
大概是因为后端db是oracle,类型是数字(0dp)。有没有办法将所有类型的 x 转换为 y 的系统类型?
标签: c# .net nhibernate