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((加载子级(惰性加载?(。

首选哪种方法,为什么?

Linq到实体和层次表

IMHO,我更喜欢您在示例中所做的操作。我喜欢调用.ToList((,因为那时我就知道我的内存中有数据,不必担心Lazy加载可能会遇到的一些问题。

"它通过惰性可加载关联泄露了对不同层的持久存储访问。"取自链接

有效的选项是公开导航属性Children并调用:

var items = ctx.KSet.Include("Children").Where(c => c.ParentId == 0);

这将允许您直接使用KSet实体。投影将创建一个新类型。在公开导航属性的情况下,如果愿意,您还可以选择使用热切加载(如示例所示(或显式/延迟加载。只有当您想筛选或排序子级时,投影才有意义。