Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq到实体和分层表_C#_Entity Framework - Fatal编程技术网

C# Linq到实体和分层表

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

我有一个带有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(),因为那时我知道我的内存中有数据,不必担心延迟加载可能带来的一些问题

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

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

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

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

因此,我想返回不同类型的子项(添加一些自定义属性,如count或类似属性),我应该继续使用上面写的内容?关于Include(“子项”)。我没有孩子!!它是同一个实体!如果你需要任何特殊的计算/未映射字段,你需要一个投影,在这种情况下,关于什么更好的问题是没有意义的,因为你只有一个选择<代码>子项不是实体,它是实体上包含其子项列表的导航属性。