Я использую Criteria для ускорения запроса, и я почти достиг цели.
Использование Query By Example для сопоставления строк в таблице, удаления повторяющихся строк с одинаковым идентификатором, а затем разбиения на страницы.
Конечно, я не могу разбить на страницы, пока не удалю повторяющиеся строки, и я не знаю, как это сделать. Это можно сделать в SQL, но тогда это соответствует свободному коду, ISQLQuery не возвращает объект ICriteria.
public IList<EntitySearch> CriteriaSearch(EntitySearch exampleEntitySearch, int startingPage, int pageSize)
{
var startRow = startingPage * pageSize;
// Query By Example.
var example = Example.Create(exampleEntitySearch)
.IgnoreCase()
.EnableLike(MatchMode.Anywhere)
.ExcludeZeroes();
var results = this.Session.CreateCriteria(typeof(EntitySearch))
.Add(example)
// select * from (SELECT ROW_NUMBER()OVER (partition by Id order by Id) As rankOrder, * FROM EntitySearch) as original where original.rankOrder = 1
.SetFirstResult(startRow)
.SetMaxResults(pageSize)
.List<DealSearch>();
return results;
}
Совет, который я прочитал, состоит в том, чтобы написать SQL-запрос в NHibernate, но я не могу придумать, как преобразовать отличный «ROW_NUMBER() по разделу SQL». Я хотел бы сначала заставить его работать от начала до конца, а затем сделать его более элегантным.
Я хотел бы запустить этот всплеск в производство и доказать ускорение ~ 90%.