2016-10-18 2 views
1
내가 NHibernate에를 통해 다음과 같은 원시 SQL 코드를 사용하고, 나는 비교에 더 많은 샘플 코드를 찾을 수 있지만, 지금

Int32에서 DateTime까지 InvalidCast 예외 - 어디에서?

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

(INT32 날짜 시간에) InvalidCastException이 함께 불어

, 나는 꽤입니다 데드 라인이 사실 DateTime 타입인지 (메서드는 다른 타입을 명시 적으로 취하지 않을 것입니다), 그리고 내가 이해할 수있는 한 결과에 타입을 강제로 넣지 않으므로이 변환은 어디에서 오는 것입니까?

+0

SQL 측에서는 어떤 쿼리가 실행 되었습니까? 프로파일 러로 확인하십시오. – Alexandr

답변

1

우리는 NHibernate가 DB로부터 데이터를로드하기를 원할 때마다 사후 결과 처리에 대해 생각해야한다. 대체로 앨리어싱은 레코드 세트 (DB)의 어떤 값이 결과 세트 (C#)의 어떤 값에 속하는 지 알아내는 데 도움을줍니다. DTO

public class ResultDto 
{ 
    public virtual int Count { get; set; } 
    public virtual DateTime MinDate { get; set; } 
    public virtual DateTime MaxDate { get; set; } 
} 

결과 문을 사용하여

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

을 우리가했던 일단 우리가 더 쉽게 만들 수 있다는 :

그래서 "별명으로"이 간단한 조정이 길을 가야하는 것입니다 :

var result = query 
    .SetResultTransformer(Transformers.AliasToBean<ResultDto>()) 
    .UniqueResult<ResultDto>() 
관련 문제