C# Linq到实体和分层表
我有一个带有id和parentId列的表,嵌套级别仅为1(目前)。C# Linq到实体和分层表,c#,entity-framework,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
现在,我加载如下项目:
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(),因为那时我知道我的内存中有数据,不必担心延迟加载可能带来的一些问题 “它通过延迟可加载关联泄漏对不同层的持久存储访问。”
取自有效选项是公开导航属性
子项
并调用:
var items = ctx.KSet.Include("Children").Where(c => c.ParentId == 0);
这将允许您直接使用
KSet
实体。投影将创建一个新类型。在公开导航属性的情况下,如果愿意,还可以选择使用急切加载(如示例所示)或显式/延迟加载。仅当您要筛选或排序子项时,投影才有意义。因此,我想返回不同类型的子项(添加一些自定义属性,如count或类似属性),我应该继续使用上面写的内容?关于Include(“子项”)。我没有孩子!!它是同一个实体!如果你需要任何特殊的计算/未映射字段,你需要一个投影,在这种情况下,关于什么更好的问题是没有意义的,因为你只有一个选择<代码>子项不是实体,它是实体上包含其子项列表的导航属性。