Nhibernate - частичная загрузка объектов - PullRequest
1 голос
/ 30 января 2012

У меня есть класс MenuObject, который представляет главное меню веб-сайтов.

Этот объект обладает следующими свойствами:

public class MenuObject
{
    public virtual int Id { get; set; }
    public virtual string Title { get; set; }
    public virtual List<MenuObject> Children { get; set; }
} 

Сопоставление настроено для активной загрузки объектов Children с использованием определения Not.LazyLoad () в свободном nhibernate.

У меня теперь есть проблема, когда я хочу использовать эти объекты для заполнения элемента управления «хлебная крошка» и элемента управления боковым меню. Для этих элементов управления все, что мне нужно, это:

  • Свойства идентификатора и заголовка
  • Коллекция Children (также содержит только два вышеуказанных свойства)

Я не хочу загружать ВСЕ свойства моего основного объекта, а также ВСЕ свойства каждого объекта ребенка, поскольку это просто излишество.

Мне удалось использовать Nhibernate Linq для возврата ТОЛЬКО свойств основного объекта, но как мне изменить запрос, чтобы сделать то же самое для дочерних объектов? (см. ???)

return (from mnu in session.Query<MenuObject>()
       (select new MenuObject()
{
    Id = mnu.Id
    Title = mnu.Title,
    Children = ???
}

---------------- EDIT ---------------------

У меня это работает, но я пропускаю предложение where - это установка 'Children' в список всех экземпляров MenuObject независимо от отношений - очевидно, я хочу, чтобы он только добавлял законные дочерние объекты к каждому родителю объект - кто-нибудь может помочь? Спасибо

from menuobject in session
    .Query<MenuObject>()
    where menuobject.Level == level
    select new MenuObject()
    {
        Title = menuobject.Title,
        Url = menuobject.Url,
        Children = session.CreateCriteria<MenuObject>()
                          .SetProjection(Projections.ProjectionList()
                          .Add(Projections.Property("Title"), "Title")
                          .Add(Projections.Property("Url"), "Url"))
                          .SetResultTransformer(Transformers.AliasToBean(typeof (MenuObject)))
                          .List<MenuObject>()
    }
    .ToList();

1 Ответ

1 голос
/ 30 января 2012

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

var results = (from mnu in session.Query<MenuObject>()
               from ch in mnu.Children
               select new
               {
                   mnu.Id,
                   mnu.Title,
                   ChildTitle = ch.Title,
                   ch.Url
               }).AsEnumerable()
               .GroupBy(row => new { row.Id, row.Title })
               .Select(gr => new
               {
                   gr.Key.Id,
                   gr.Key.Title,
                   Children = gr.Select(c => new { c.ChildTitle, c.Url }).ToList()
               });
...