Linq Nhibernate-对象的部分加载

Linq Nhibernate-对象的部分加载,linq,nhibernate,linq-to-nhibernate,Linq,Nhibernate,Linq To Nhibernate,我有一个MenuObject类,它表示网站的顶级菜单 除其他属性外,该对象还具有以下属性: public class MenuObject { public virtual int Id { get; set; } public virtual string Title { get; set; } public virtual List<MenuObject> Children { get; set; } } 映射已配置为使用fluent nhiberna

我有一个MenuObject类,它表示网站的顶级菜单

除其他属性外,该对象还具有以下属性:

public class MenuObject
{
    public virtual int Id { get; set; }
    public virtual string Title { get; set; }
    public virtual List<MenuObject> Children { get; set; }
} 
映射已配置为使用fluent nhibernate中的Not.LazyLoad定义急切地加载子对象

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

ID和标题属性 子集合也仅包含上述两个属性 我不想加载我的主对象的所有属性,也不想加载每个孩子对象的所有属性,因为这太过分了

我已经设法使用Nhibernate Linq仅检索主对象的属性,但是如何修改查询以对子对象执行相同的操作?看到了吗

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

我需要这样做,但我缺少了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();

对不起,我错过了多个孩子的部分。此外,我更喜欢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()
               });

对不起,我错过了多个孩子的部分。此外,我更喜欢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()
               });

谢谢-但是您的答案似乎将属性“Children”设置为我对象的单个实例-“Children”实际上是一个列表-我尝试过这一点,但没有luckI像上面那样解决,只是需要一些帮助来过滤出子对象感谢答案和提示;有关于使用ViewModels的例子吗?ViewModels只是一些类,这些类具有它们所使用的视图的相关数据,没有什么稀奇古怪的库-但是你的答案似乎将属性“Children”设置为我对象的单个实例-“Children”实际上是一个列表-我已经尝试过了,但没有luckI像上面那样解决了这个问题,但是只需要一些帮助过滤掉孩子们的对象谢谢答案和提示;有关于使用ViewModels的例子吗?ViewModels只是一些类,这些类具有所使用视图的相关数据,没有什么特别之处