2011-01-12 68 views
2

我試圖用nhibernate從mysql數據庫中檢索數據。不過,我需要投影來運行一些計算。 Nhibernate似乎不喜歡那樣。它與linq to sql很好。nhibernate複雜投影表達式

 var purchases = _session.QueryOver<Purchase>() 
         .Where(validPID<Purchase>(portfolioID)) 
         .SelectList(list => list 
          .SelectGroup(c => c.currency)         
          .SelectSum(c => c.shares * c.price - c.commission)) 

我得到「無法確定來自((c.shares * c.price) - c.commission)的成員」爲錯誤。

我該怎麼寫這個工作?

感謝

您正在使用什麼庫LINQ的擴展具有的SelectList,SelectGroup和SelectSum
+0

我猜選擇和內查詢不正確。你可以在那裏嘗試這個(c.shares * c.price) - c.commission。我不認爲它會工作,因爲Linq不能保證*和 - 並將它們翻譯成SQL查詢 – Baz1nga 2011-01-13 03:58:22

回答

0

?它們不是這些操作的標準方法,它們不是NH提供的擴展。因此,NHibernate可能不知道如何處理它們。通常,在構建Linq2NH查詢時,不能使用任何自定義擴展方法;如果它不是來自System.Linq或NHibernate.Linq,則不能使用它(其中一個例外是IEnumerable.Contains(),這意味着IN查詢)

嘗試插入一個AsEnumerable( )在Where方法後調用。這將基本上強制對Queryable表達式樹進行評估,並且所有進一步的操作將在對象(或其NH代理,根據需要填充)在內存中執行。

+0

嗨,這是NH 3.0的一個標準。它不是提供的linq。如果可能,我真的很想在數據庫中執行所有計算。 – Leon 2011-01-12 20:46:56

0

爲什麼不使用HQL代替。我不知道如何將你的查詢翻譯成HQ1,因爲我無法制作它的頭部或尾部,但是你的artihematic操作將在HQL中得到支持。

如果你能解釋你在做什麼,我可能會幫助你查詢。

0

我actaully結束了在代碼總結這樣

 var purchases = (from p in _session.QueryOver<Purchase>() 
            .Where(validPID<Purchase>(portfolioID)).List().ToList() 
         group p by p.currency into currencies 
         select new object[2] { 
          currencies.Key, 
          currencies.Sum(f => -1*f.price*f.shares - f.commission) 
         }).ToList();