从Int32到DateTime的InvalidCast异常 - 但在哪里?

时间:2016-10-18 00:04:54

标签: c# nhibernate

我通过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类型(该方法显然不会采用任何其他类型),据我所知,我不强制对结果使用类型,所以在哪里这种转换来自?

1 个答案:

答案 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>()