Nhibernate - Как получить упорядоченные отличные результаты с QueryOver? - PullRequest
2 голосов
/ 28 июля 2010
public class City
{
    virtual public long Id { get; set; }
    virtual public string Name { get; set; }
}

Таблица городов содержит дублированные имена, и я хочу удалить дубликаты. Я также хочу, чтобы результаты были упорядочены по Id.

Сначала я подумал о следующем запросе.

select distinct Name from City order by Id;

Но это разрывается с тем, что «элементы ORDER BY должны появляться в списке выбора, если указано SELECT DISTINCT» исключение. После просмотра http://weblogs.sqlteam.com/jeffs/archive/2007/12/13/select-distinct-order-by-error.aspx я думаю, что я должен сделать:

select Name from City group by Name order by min(Id)

Итак, мой вопрос: как я могу выполнить этот запрос с QueryOver?

Ответы [ 2 ]

5 голосов
/ 27 сентября 2010

Это возможно в ICriteria:

var list =
    session.CreateCriteria<City>()
        .SetProjection(Projections.Group("Name"))
        .AddOrder(Order.Asc(Projections.Min("Id")))
        .List<string>();

Но в настоящее время это невозможно в QueryOver, поскольку отсутствует перегрузка .OrderBy (IProjection).Как только отсутствующая перегрузка была добавлена, она должна выглядеть примерно так:

var list =
    s.QueryOver<City>()
        .Select(Projections.Group<City>(p => p.Name))
        .OrderBy(Projections.Min<City>(c => c.Id)).Asc
        .List<string>();

Обратите внимание, что перегрузки проекций уже существуют, поэтому вы можете написать следующий (типобезопасный) запрос в ICriteria:

var list =
    session.CreateCriteria<City>()
        .SetProjection(Projections.Group<City>(c => c.Name))
        .AddOrder(Order.Asc(Projections.Min<City>(c => c.Id)))
        .List<string>();
0 голосов
/ 23 мая 2018

Итак, я обнаружил, что это довольно просто ...

var query = session.QueryOver<MyModel>()
            // Conditions here
            .OrderBy(m => m.GetThisDistinctField).Desc()  // ...or Asc()...
            .SelectList(m => m.SelectGroup(g => g.GetThisDistinctField));

var result = query.List<FieldDataType>().ToList();
return result;

Чтобы получить упорядоченный запрос в queryover, начните с запроса, который включает в себя все необходимые критерии, но затем добавьте SelectList / SelectGroup, чтобы получить внятный список.Другими словами, это похоже на то, как NHibernate может принимать обычный запрос, а затем делать специальные вещи, чтобы сделать его запросом select distinct.

Это решение, которое я использую в текущем проекте, которое я использую.работа над;Надеюсь, это поможет кому-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...