2013-06-19 73 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秒)