2011-02-01 3 views
1

У меня есть SQL, что я хотел бы написать в Criteria API:как группы по диапазонам в NHibernate с критериями апи

SELECT CASE 
WHEN total_pages = 0 THEN '0 pages' 
WHEN total_pages BETWEEN 1 AND 3 THEN '1-3 pages' 
WHEN total_pages BETWEEN 4 AND 6 THEN '4-6 pages' 
WHEN total_pages > 6 THEN '7 + pages' 
END AS pagerange, sum(total_pages) AS 'Total' 
FROM dbo.connector_log_entry 
GROUP BY 
CASE 
WHEN total_pages = 0 THEN '0 pages' 
WHEN total_pages BETWEEN 1 AND 3 THEN '1-3 pages' 
WHEN total_pages BETWEEN 4 AND 6 THEN '4-6 pages' 
WHEN total_pages > 6 THEN '7 + pages' 
END 
ORDER BY pagerange 

ответ

0
var groupBy = @" 
    CASE 
     WHEN total_pages = 0 THEN '0 pages' 
     WHEN total_pages BETWEEN 1 AND 3 THEN '1-3 pages' 
     WHEN total_pages BETWEEN 4 AND 6 THEN '4-6 pages' 
     WHEN total_pages > 6 THEN '7 + pages' 
    END"; 
var pagerange = Projections.SqlGroupProjection(groupBy + " pagerange", 
               groupBy, 
               new[] { "pagerange" }, 
               new[] { NHibernateUtil.String }); 
var results = session.CreateCriteria<ConnectorLogEntry>() 
        .SetProjection(pagerange, 
            Projections.Sum("TotalPages")) 
        .List(); 

Это предполагает ваш класс называется ConnectorLogEntry и свойство преобразовываться в TOTAL_PAGES столбец называется TotalPages.

Я обязан вам бит ORDER BY, но вы всегда можете сортировать клиентскую сторону.

+0

Я сам оказался с почти таким же кодом. И порядок работы тоже хорош. одна вещь, которую я добавил, это var caseString = @ "CASE WHEN total_pages = 0 THEN 'a0 pages' КОГДА total_pages МЕЖДУ 1 И 3 ТОГДА 'b1-3 страницы' КОГДА total_pages МЕЖДУ 4 И 6 ТОГДА 'c4-6 страниц '... буквы алфавита в PageRanges для хорошей сортировки –

Смежные вопросы