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

本文关键字:在哪里 DateTime 异常 Int32 InvalidCast | 更新日期: 2023-09-27 18:13:23

我通过NHibernate使用以下原始SQL代码,我找不到更多的示例代码进行比较,但它爆炸与InvalidCastException (Int32到DateTime)

var query = session.CreateSQLQuery("SELECT COUNT(*), MIN(Created), MAX(Created)" + 
                                   " FROM MyStuff WHERE Created < :deadline")
                   .SetDateTime("deadline", deadline)
                   .UniqueResult();

现在,我很确定截止日期实际上是DateTime类型(该方法甚至不会采取任何其他类型显然),据我所知,我不强制类型的结果,所以这个转换是从哪里来的?

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

每当我们想让NHibernate从DB加载数据时,我们必须考虑事后结果处理。大多数情况下,混叠是为了正确地帮助找出记录集(DB)中的哪个值属于结果集(c#)中的哪个值。

所以这个简单的调整"AS别名"是可行的:

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; }
}

result语句:

var result = query
    .SetResultTransformer(Transformers.AliasToBean<ResultDto>())
    .UniqueResult<ResultDto>()