2012-05-09 54 views
5

我有一些報告執行sprocs比複雜的QueryOver語句更容易和更簡單的實例。NHibernate - 執行SQL來填充DTO

我有一個DTO,而不是一個實體,它表示從查詢返回的數據,並希望將查詢結果填充到DTO中。我正在使用命名查詢和session.GetNamedQuery()來執行查詢。

  1. 我是否必須爲DTO創建映射文件?
  2. 如果是這樣,是否可以讓NHibernate/FluentNHibernate知道它不應該爲DTO創建表?我的單位測試下降,並使用NH的SchemaExport工具的模式,不希望創建表的DTO的

請注意,我不希望使用投影和AliasToBean投射QueryOver/Linq查詢 - 我需要執行存儲過程。

乾杯

回答

9

使用CreateSQLQuery,下面的工作不需要任何映射文件。也許你可以用命名查詢試試看:

public class YourDto 
{ 
    public int YourDtoId { get; set; } 
    public string YourDtoTitle { get; set; } 
} 

然後

var result = yourNhSession 
    .CreateSQLQuery("select yourColumn1 as YourDtoId, yourColumn2 as YourDtoTitle from YOUR_TABLE") 
    .SetResultTransformer(Transformers.AliasToBean<YourDto>()) 
    .List<YourDto>(); 
+0

這很好,但不適用於命名查詢,因爲nh在啓動時構建配置時需驗證命名查詢中使用的類,並且需要了解DTO。如果沒有其他人提供解決方案,將修改代碼以使用此代碼。謝謝 – Chev

2

如果你想,我建議你在你的架構添加像Dapper微/ ORM要做到這一點最簡單的解決方案。它只是在您的項目中刪除single file並按照樣本。爲了我,這是與NH配對的最佳解決方案,當你必須執行由於某種原因中的實體邏輯以外的東西。

+0

+1短小精悍。看起來很酷。 – Chev

+0

@Chev就是這樣,是一個很好的NH伴侶,並且由於它消除了NH擁有的很多管道,它正在快速減輕。 –