2014-03-12 34 views
0

我有一個稱爲FiscalYear的值類型,它基本上是一個整數的包裝。我也爲它實施了NHibernate.UserTypes.IUserType。現在我可以將FiscalYear類型的屬性直接映射到SQL類型,NHibernate會自動轉換它們。如何將原生SQL查詢結果映射到NHibernate中的自定義值類型列表?

這一切正常。但是現在我想執行一個本地SQL查詢來從數據庫中獲得財政年度列表。下面是當前的代碼:

public IEnumerable<FiscalYear> FiscalYears 
{ 
    get 
    { 
     var result = new List<FiscalYear>(); 
     foreach (var fiscalYear in Session.CreateSQLQuery(FiscalYearsQuery).List<Int16>()) 
     { 
      result.Add(new FiscalYear(fiscalYear)); 
     } 
     return result; 
    } 
} 

是工作,但我的問題是:既然我已經執行了IUserTypeFiscalYear,是有可能簡化這個代碼是這樣的:

public IEnumerable<FiscalYear> FiscalYears 
{ 
    get 
    { 
     return Session 
      .CreateSQLQuery(FiscalYearsQuery) 
      .List<FiscalYear>(); 
    } 
} 

不幸的是,這是行不通的。使用Transformers.AliasToBean也沒有幫助,因爲FiscalYear是一個值類型而不是實體。

我認爲這確實是一件容易做到的事情,但我迄今爲止的所有嘗試都失敗了。我想我只是錯過了什麼?

+0

我不認爲有這個 –

回答

0

當您使用CreateSQLQuery必須添加類型的返回值的,我從來沒有使用自定義類型的原生SQL查詢,但你可以嘗試:

return Session 
    .CreateSQLQuery(FiscalYearsQuery) 
    .AddScalar("*QueryColumnName*", FiscalYear) 
    .List<FiscalYear>(); 

如果不工作,你可以實現IResultTransformer爲更優雅的方式來轉換您的數據。

+0

支持謝謝,但這甚至不是有效的語法。此外,除了列名之外,'AddScalar'只接受'NHibernate.Type.IType'的一個實例,其'NHibernate.UserTypes.IUserType'沒有擴展,因此'FiscalYearType'沒有實現。實現'IResultTransformer'是一個選項,但它只會使情況變得更糟,因爲我所要做的就是讓代碼更簡單,而不是更復雜。 – proskor

+0

對不起,如果我不明白怎麼可以更復雜添加一行代碼調用你的變壓器,而不是一個foreach。 – Najera

+0

當然,使用'IResultTransformer'是一行代碼,但是我必須實現它,而且它不止是一行代碼,而且可能不僅僅是一個foreach。我只是認爲這一切都是沒有必要的,因爲我已經實現了'IUserType' ... – proskor

相關問題