2016-10-18 2 views
1
私はNHibernateはを通じて、次の生のSQLコードを使用しています、と私はと比較するより多くのサンプルコードを見つけることができませんが、それは今

Int32からDateTimeへのInvalidCast Exception - ただしどこですか?

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

(のInt32のDateTimeに)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>() 
関連する問題