Критерии 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();
Другие вопросы по тегам