NHibernate ICriteria - порядок по количеству коллекций детей - PullRequest
2 голосов
/ 26 июля 2010

Вот простой пример сценария -

У «тега» много «вопросов».Когда я получаю список тегов, как мне выполнить сортировку по количеству вопросов тегов с помощью API критериев?

Я делал это раньше, но не касался NH в течение 4 месяцев и забыл ... прогнозы?помогите !!!

Спасибо

Ответы [ 2 ]

1 голос
/ 29 июля 2010

Сели со свежей парой глаз и выяснили это ... Теги теперь упорядочены по свойствам в коллекции Вопросов по тегам (просмотры) .., которая имела больше смысла в моем домене, чем по количеству детей

    public IList<Tag> GetTop(int numberOfTags)
    {
        using (ITransaction transaction = Session.BeginTransaction())
        {

            DetachedCriteria detachedCriteria = DetachedCriteria.For<Tag>()
                    .CreateCriteria<Tag>(x => x.Questions)
                    .AddOrder<Question>(x => x.Views, Order.Desc)
                    .SetMaxResults(numberOfTags)
                    .SetProjection(Projections.Distinct(Projections.Id()));

            IList<Tag> tags = Session.CreateCriteria<Tag>()
                .SetFetchMode<Tag>(x => x.Questions,FetchMode.Join)
                .Add(LambdaSubquery.Property<Tag>(x => x.Id).In(detachedCriteria))
                .SetResultTransformer(new DistinctRootEntityResultTransformer())
                .List<Tag>();

            transaction.Commit();
            return tags;
        }
    }
0 голосов
/ 26 июля 2010

Попробуйте:

var tags = Session.CreateCriteria(typeof(Tag))
                  .AddOrder(Order.Asc("Tag.Question.Id")
                  .List<Tag>();

// If that does not work, try:
var tags = Session.CreateCriteria(typeof(Tag))
                  .CreateCriteria("Question", "TagQuestion", JoinType.InnerJoin)
                  .AddOrder(Order.Asc("TagQuestion.Id")
                  .List<Tag>();
  1. Заказ на соединенные столбцы.
  2. Порядок критериев запроса .

Редактировать: Если вы не решите против него или вы уже не знакомы с Criteria API, вам следует взглянуть на HQL или NHibernate.Linq

var tags = Session.Linq<Tag>()
               .OrderBy(tag => tag.Question.Id)
               .ToList();

Linq для NHibernate: значительное улучшение.

...