Nhibernate - 部分加载对象

时间:2012-01-30 12:36:18

标签: linq nhibernate linq-to-nhibernate

我有一个表示网站Top Menu的MenuObject类。

此对象具有以下属性:

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

映射已配置为使用流畅的nhibernate中的Not.LazyLoad()定义急切加载Children对象。

我现在遇到一个问题,我想使用这些对象来填充面包屑控件和侧面菜单控件 - 对于这些控件,我只需要:

  • ID和标题属性
  • 儿童系列(也只包含上述两个属性)

我不想加载主对象的所有属性以及每个子对象的所有属性,因为它只是矫枉过正。

我已经设法使用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 个答案:

答案 0 :(得分: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()
               });