我通过NHibernate使用以下原始SQL代码,我找不到更多的示例代码来进行比较,但是它出现了InvalidCastException(Int32 to DateTime)
var query = session.CreateSQLQuery("SELECT COUNT(*), MIN(Created), MAX(Created)" +
" FROM MyStuff WHERE Created < :deadline")
.SetDateTime("deadline", deadline)
.UniqueResult();
现在,我很确定截止日期实际上是DateTime类型(该方法显然不会采用任何其他类型),据我所知,我不强制对结果使用类型,所以在哪里这种转换来自?
答案 0 :(得分:1)
每当我们希望NHibernate从DB加载数据时,我们必须考虑事后结果处理。通常,别名,以正确帮助找出记录集(DB)中的哪个值属于结果集(C#)中的哪个值。
所以这个简单的调整&#34; AS别名&#34;是要走的路:
var query = session
.CreateSQLQuery("SELECT COUNT(*) AS Count, " +
" MIN(Created) AS MinDate, " +
" MAX(Created) AS MaxDate " +
" FROM MyStuff WHERE Created < :deadline")
.SetDateTime("deadline", deadline)
;
var result = query
.UniqueResult<object[]>()
;
var count = (int) result[0];
var minDate = (DateTime)result[1];
var maxDate = (DateTime)result[2];
一旦我们这样做了,我们可以使用DTO使其变得更加容易
public class ResultDto
{
public virtual int Count { get; set; }
public virtual DateTime MinDate { get; set; }
public virtual DateTime MaxDate { get; set; }
}
结果陈述:
var result = query
.SetResultTransformer(Transformers.AliasToBean<ResultDto>())
.UniqueResult<ResultDto>()