Критерии NHibernate QueryByExample застрял с SQL в середине
Я использую критерии для ускорения запроса, и я почти там.
Использование 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%.
1 ответ
Я не уверен в производительности, но вы могли бы использовать LINQ:
Изменить:
.List<DealSearch>();
Для того, чтобы:
.List<DealSearch>().Distinct().ToList();