2013-06-19 24 views
0

我有一个自引用实体:实体框架自我参照实体查询结果是平的,hiearchical

EF Mapping

当我询问这个​​实体..

var query = this._context.DispositionPossibilities 
    .Where(x => x.AreaID == areaID) 
    .Where(x => x.IsActive == true); 

。得到的集合中的每个项都从根目录中的查询返回,然后这些具有ParentID的项目在子集合内部被“复制”(因为导航属性)。

我可以这样做删除:

// have to ToArray() first because the child entities will be excluded if I don't.. 
    rValue = query.ToArray(); 
    // trim off the entities at the root that shouldn't be there.. 
    rValue = rValue.Where(x => !x.ParentCode.HasValue).ToArray(); 

。但有没有更好的办法做到这一点?

回答

4

[编辑]
我的原始Include溶液下面不穿过整个层次结构。这对我来说应该是显而易见的,但它只会返回层次结构的第一层。

因为我每天最多只会打一次这个电话,所以我会选择性能最高的。

这就是说,我也想出了一个更好的方式来剥离层次结构中的非根元素:

var subset = new List<DispositionPossibility>(); 
foreach (var disp in query.OrderBy(x => x.ParentCode).ToArray()) 
{ 
    if (!disp.ParentCode.HasValue) 
     subset.Add(disp); 
    else 
     break; 
} 

此卷绕为0.4-0.7秒快于所述第一方法我正在使用。 (所以几乎和Include方法一样好,但实际上给了我所有的关卡。) 添加ASC排序并打破了我的27k物品树上刮掉的.1.25秒的循环。




[原件(BAD)答]

不看这个了一天回来后,它会采取了所有5秒想如何做到这一点。由大约0.73到0.83秒最引人注目的是对我最大的有4个级别,并〜27400项树 -

var query = context.DispositionPossibilities 
    .Include("ChildDispositions") 
    .Where(x => x.AreaID == areaID) 
    .Where(x => !x.ParentCode.HasValue) 
    .Where(x => x.IsActive == true); 

我跑了代码分析,这种方法执行在几乎所有情况下更好。
- 对于小树木(< 5,000),差异不明显(小于.01 - .05秒)