我有一个id和parentId列的表,嵌套级别只有1(现在) 现在我加载这样的项目:
using (KEntities ctx = new KEntities())
{
ctx.KSet.MergeOption = MergeOption.NoTracking;
var items = (from c in ctx.KSet
where c.ParentId == 0
select new
{
Title = c.Title,
Id = c.Id,
Subs = ctx.KSet.Where(o => o.ParentId == c.Id)
}).ToList();
}
我可以选择的另一个选项是在表上设置自引用,因此实体将公开自导航属性,然后我可以使用Load()加载子项(延迟加载?)。
哪种方法更受欢迎?为什么?
答案 0 :(得分:0)
恕我直言,我更喜欢你在你的例子中所做的事情。我喜欢调用.ToList()因为那时我知道我有内存中的数据,并且不必担心Lazy加载时可能遇到的一些问题。
“它通过懒惰的可加载关联泄漏了对不同层的持久存储访问。” 取自link
答案 1 :(得分:0)
有效选项是公开导航属性Children
并调用:
var items = ctx.KSet.Include("Children").Where(c => c.ParentId == 0);
这将允许您直接与KSet
实体合作。投影将创建一种新类型。在暴露导航属性的情况下,您还可以选择使用预先加载(如示例所示)或显式/延迟加载(如果您愿意)。只有当您想对儿童进行过滤或排序时,投影才有意义。