2013-03-28 59 views
0

有什麼辦法讓NHibernate使用Window函數嗎?nhibernate和窗口函數

具體來說,我希望建立類似下面的查詢:

SELECT 
    date, 
    SUM(Price) OVER (ORDER BY date) 
FROM purchases 
GROUP BY date 

我已經搜索網絡並不能找到有關窗函數和NHibernate什麼

具體來說,我m使用NHibernate的QueryOver接口。

如果這是不可能的,還有什麼其他解決方案來保持我的代碼中的數據庫獨立性?

+0

不應該是SUM(Price)OVER(PARTITION BY date)? – jbl

+0

對於SQL Server是的,但不適用於Postgres。 – Martin

+0

thx,你應該添加到你的問題/標籤 – jbl

回答

0

很好的問題,但不幸的是,我從來沒有看到任何代碼在NHibernate本身,將允許它產生這樣的窗口功能。

您唯一的選擇是使用命名查詢。在您的命名查詢中,您可以手動輸入SQL或調用存儲過程。

您聲明您希望保持解決方案數據庫的獨立性。我從來沒有親自關心過像SQL Server那樣的事情,但我可以理解你來自哪裏。我聽說過幾個人使用內存SQLite解決方案運行他們的集成測試,然後在SQL Server或Oracle上運行他們的實際代碼。

在你的場景中,我不認爲你的問題中的SQL無論如何都是ANSI兼容的,所以如果你使用命名查詢使它與數據庫無關,那麼你不得不以不同的方式重寫它。

0

據我所知,你不能這樣做與QueryOver API。

我會盡可能保持獨立於數據庫的可能性是將窗口化查詢視爲表和查詢之間的連接。然後編寫一個QueryOver來引導這個連接。

考慮您的查詢會導致這樣的:(儘管例子似乎並沒有真正顯示一個窗口查詢的需要)

SELECT 
    purchases.date, 
    purchasesGroup.priceSum 
FROM 
    purchases 
INNER JOIN 
    (SELECT date, SUM(Price) as priceSum FROM purchases GROUP BY date) 
     AS purchasesGroup 
on purchases.date = purchasesGroup.date 
+0

但是,感謝您的評論,您無法加入QueryOver中的子查詢。 – Martin

0

你可能會使用這樣的觀點。這至少可以抽象出一點,儘管你確實將依賴關係遷移到數據庫模式。

我最近遇到了這類問題,並且我開始意識到我經常試圖以一種並非真正持久實體的方式來使用NHibernate。如果我是Ayende Rahien,我可能會知道該怎麼做,但由於我不是,通常最終會混入一個小巧的Dapper,因爲我只需要諸如統計關於數據的只讀聚合結果。