Linq to实体和Hierarchical表

时间:2011-07-03 19:02:20

标签: c# entity-framework

我有一个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()加载子项(延迟加载?)。

哪种方法更受欢迎?为什么?

2 个答案:

答案 0 :(得分:0)

恕我直言,我更喜欢你在你的例子中所做的事情。我喜欢调用.ToList()因为那时我知道我有内存中的数据,并且不必担心Lazy加载时可能遇到的一些问题。

“它通过懒惰的可加载关联泄漏了对不同层的持久存储访问。” 取自link

答案 1 :(得分:0)

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

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

这将允许您直接与KSet实体合作。投影将创建一种新类型。在暴露导航属性的情况下,您还可以选择使用预先加载(如示例所示)或显式/延迟加载(如果您愿意)。只有当您想对儿童进行过滤或排序时,投影才有意义。