Linq到实体和层次表
本文关键字:层次 实体 Linq | 更新日期: 2023-09-27 18:00:55
我有一个带有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((加载子级(惰性加载?(。
首选哪种方法,为什么?
IMHO,我更喜欢您在示例中所做的操作。我喜欢调用.ToList((,因为那时我就知道我的内存中有数据,不必担心Lazy加载可能会遇到的一些问题。
"它通过惰性可加载关联泄露了对不同层的持久存储访问。"取自链接
有效的选项是公开导航属性Children
并调用:
var items = ctx.KSet.Include("Children").Where(c => c.ParentId == 0);
这将允许您直接使用KSet
实体。投影将创建一个新类型。在公开导航属性的情况下,如果愿意,您还可以选择使用热切加载(如示例所示(或显式/延迟加载。只有当您想筛选或排序子级时,投影才有意义。