Критерии NHibernate QueryByExample застрял с SQL в середине - PullRequest
5 голосов
/ 04 ноября 2011

Я использую Критерии для ускорения запроса, и я почти готов.

Использование 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 Ответ

0 голосов
/ 05 января 2012

Я не уверен насчет производительности, но вы можете использовать LINQ:

Изменить:

.List<DealSearch>();

На:

.List<DealSearch>().Distinct().ToList();
...