2009-11-12 67 views
0

我需要知道我可以重寫NHibernate的的ICriteria格式下面的SQL查詢。它基本上是一種模仿MS-SQL的RANK()功能並僅返回最新的結果的方法。需要幫助複雜的SQL查詢NHibernate的

SELECT a.Name, a.Value, a.CreationDate 
FROM MyTable a 
WHERE EXISTS 
(
    SELECT NULL 
    FROM 
    (
    SELECT TOP 1 CreationDate 
    FROM MyTable 
    WHERE Name = a.Name 
    ORDER BY CreationDate DESC 
) b 
    WHERE b.CreationDate = a.CreationDate 
) 

例如,給定具有下列數據的表:

名稱,值CREATIONDATE
'鍵一次', '值的一個V1', '2009-11-11'
'關鍵一」, '值一個V2', '2009-11-12'
'兩個重點', '值的兩個V1', '2009-11-09'
'三個重點', '價值的三大V2', '2009-09-09'
'三個重點', '價值的三大V1', '2009-09-06'
「關鍵三分」, '價值的三大V3', '2009-10-01'

上述查詢的結果將是:

'鍵一', '值一個V2', '2009-11-12'
'兩個重點', '值的兩個V1', '2009-11-09'
'三個重點',「價值的三大V3, '2009-10-01'

回答

0

當查詢到複雜,不要「T使用‘標準API’,而是‘HQL’,你可以失去很多的時間來找到‘標準API’的解決方案。您顯示的查詢幾乎可以不加改變地使用。看這個:https://www.hibernate.org/hib_docs/nhibernate/html/queryhql.html

在生成的代碼是,在一般情況結束時,用「標準API」或「HQL」相同...

一段代碼:

StringBuilder query = new StringBuilder(); 
query.Append("from MyTable where "); 
query.Append("DateOfDayStart <= :startDate and DateOfDayEnd >= :endDate "); 
IList<MyTable> list = session.CreateQuery(query.ToString()) 
    .SetDateTime("startDate", startDate) 
    .SetDateTime("endDate", endDate) 
    .List<MyTable>(); 
return list;