我有一个表示网站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对象。
我现在遇到一个问题,我想使用这些对象来填充面包屑控件和侧面菜单控件 - 对于这些控件,我只需要:
我不想加载主对象的所有属性以及每个子对象的所有属性,因为它只是矫枉过正。
我已经设法使用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();
答案 0 :(得分:1)
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()
});