Я использую Критерии для ускорения запроса, и я почти готов.
Использование 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% ускоряется.