2012-01-30 5 views
1

У меня есть класс MenuObject, который представляет собой веб-сайт Top Menu.Nhibernate - частичная загрузка объектов

Этот объект имеет среди других свойств, следующее:

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() в Fluent NHibernate.

теперь у меня есть проблема, когда я хочу использовать эти объекты для заполнения элемента управления строку навигации и управления sidemenu - Для этих элементов управления Все, что мне нужно:

  • Идентификатор и Название Свойства
  • Детская коллекция (также содержит только указанные выше свойства)

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

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

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

---------------- РЕДАКТИРОВАТЬ -------------------- -

У меня есть это для работы, но у меня отсутствует предложение where - это установка «Дети» в список всех экземпляров 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

Извините, я пропустил часть детской части. Также я бы предпочел 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() 
       }); 
+0

Спасибо - однако ваш ответ, как представляется, установить свойство «Дети» к одному экземпляру моего объекта - «Дети» на самом деле список - Я попытался это, но не повезло – user1162591

+0

я понял это как указано выше, но просто нужно немного помочь отфильтровывать дочерние объекты – user1162591

+0

Спасибо за ответ и отзыв; Есть ли примеры использования ViewModels? – user1162591

Смежные вопросы