簡體   English   中英

NHibernate:SQL查詢結果映射

[英]NHibernate: SQL query results mapping

我在NHibernate 3.1.0.4000(我正在使用MS SQL Server 2005數據庫)中遇到SQL查詢結果的問題。 我有兩個表: AdvertsInvestments ,它們映射到實體: AdvertInvestment Adverts通過InvestmentId列(和外鍵)與Investments相關聯。

為了保存查詢結果,我創建了一個以下內部類:

    class InvestmentWithAdvertsCount
    {
        public Investment inv { get; set; }

        public int cnt { get; set; }
    }

查詢如下:

var investementsWithAdvertCounts = _session.CreateSQLQuery(
                            "select {inv.*}, (select count(1) from Adverts where InvestmentId = inv.Id) cnt from Investments inv")
                            .AddScalar("cnt", NHibernateUtil.Int32)
                            .AddEntity("inv", typeof(Investment))
                            .SetResultTransformer(NHibernate.Transform.Transformers.AliasToBean(typeof(InvestmentWithAdvertsCount)))
                            .List<InvestmentWithAdvertsCount>();

當我運行此查詢時,我收到一個InvestmentWithAdvertsCount實例的集合,它具有正確填充的cnt屬性,但inv屬性設置為null 我花了一些時間深入研究NHibernate源代碼,似乎inv別名在某種程度上從查詢中丟失了,NHibernate甚至都沒有嘗試填充inv屬性。 如果我刪除.SetResultTransformer部分,我會收到一個數組列表(類型為object[2] ),第一個元素設置為Investment實體,第二個元素設置為相應的廣告計數。 您能否告訴我如何更改此查詢以使InvestmentWithAdvertsCount正確填充? 或者可能有一種方法可以將此查詢重寫為QueryOver,Criteria或HQL(保持生成的SQL代碼有效)?

對於這個問題,我會非常感激。 謝謝

這是一個干凈的方法,使用非常簡單的LINQ to對象處理結果:

session.CreateSQLQuery(
    "select {inv.*}, (select count(1) ... inv")
    .AddScalar("cnt", NHibernateUtil.Int32)
    .AddEntity("inv", typeof(Investment))
    .List<object[]>()
    .Select(x => new InvestmentWithAdvertsCount {inv = x[0], cnt = x[1]})
    .ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM