Свободный порядок NHibernate по свойству в связанной сущности

#nhibernate #fluent-nhibernate #sql-order-by

#nhibernate #свободный-nhibernate #sql-order-by

Вопрос:

В моей базе данных есть 2 таблицы:

 CREATE TABLE [items](
    [item_id] [int] IDENTITY(1,1) NOT NULL,
    [item_name] [varchar](50) NOT NULL,
    [group_id] [int] NOT NULL   
)

CREATE TABLE [itemgroup](
    [group_id] [int] IDENTITY(1,1) NOT NULL,
    [group_name] [varchar](50) NULL 
)
  

и вот классы сопоставления для этих сущностей:

     public class ItemMap : ClassMap<Item>
    {
        public ItemMap()
        {
            Table("items");
            Id(x => x.Id).Column("item_id");
            Map(x => x.Name).Column("item_name");
            References(x => x.ItemGroup).Column("group_id").Fetch.Join();            
        }
    }
    public class ItemGroupMap : ClassMap<ItemGroup>
    {
        public ItemGroupMap()
        {
            Table("itemgroup");
            Id(x => x.Id).Column("group_id");
            Map(x => x.Name).Column("group_name");
        }
    }
  

Как я могу получить все элементы из базы данных, упорядоченные по имени группы?

На всякий случай я использую свободный NHibernate версии v1.2.0.712.

Комментарии:

1. Какой метод запроса вы используете Criteria, QueryOver, Linq или HQL?

2. @Vadim Я использую критерии для получения всех элементов, вот пример моего кода: using (var session = SessionFactory.OpenSession()) { return session.CreateCriteria(typeof(TEntity)).AddOrder(CreateOrder(sortedBy, sortDirection)).SetFirstResult((pageIndex - 1) * pageSize).SetMaxResults(pageSize).List<TEntity>(); }

3. Извините, забыл добавить private static Order CreateOrder(string sortedBy, string sortDirection) { return new Order(sortedBy, true); } sortedBy — это имя свойства.

Ответ №1:

Вам просто нужно добавить объединение к вашим критериям.

 var criteria = Session.CreateCriteria<Item>()
                      .CreateAlias("ItemGroup", "group")
                      .AddOrder(Order.Asc("group.Name"));
  

Ответ №2:

в вашей ItemGroup у вас должен быть список элементов, предположим, вы называете это Items

Затем в ItemGroupMap добавьте

 mapping.HasMany(x => x.Items)
            .Cascade.All()
            .Inverse()
            .SetAttribute("order-by", "item_name");
  

Теперь у вас может быть список ItemGroup со всеми дочерними элементами, упорядоченными по item_name

Комментарии:

1. При этом будут получены все элементы для группы, упорядоченные по имени. OP хочет, чтобы все элементы из базы данных были упорядочены по имени группы элементов.