【问题标题】:NHibernate (c#.net) - automatically map results of a SQLQuery to a dto objectNHibernate (c#.net) - 自动将 SQLQuery 的结果映射到 dto 对象
【发布时间】: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


【解决方案1】:

也许 System.Linq.Dynamic 会有所帮助:

use System.Linq.Dynamic;

string ColumnAlisName = "ColumnOne";
var query = mytable.Select(String.Format("new (mycol1 as {0})",ColumnAlisName)); 

【讨论】:

  • 感谢您的建议,但我真的不知道这有什么帮助?你知道我正在尝试将 NHibernate SQLQuery 的列别名自动映射到未映射的 POCO 对象吗?
猜你喜欢
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 2020-12-08
  • 2012-11-23
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多