2013-11-27 238 views
0

如何使用linq查詢和EF檢索分層樹結構?提取樹形結構

我的數據庫具有用於Tab表其爲1對多至TabGroupBox爲1對多至FieldDetail

我想檢索基於一些標準的結構僅部分。

說,我已在數據庫中的以下內容:

標籤(名稱)

"Tab1" 
"Tab2" 
"Tab3" 

TabGroupBox(Tab.Name,名稱)

"Tab1", "Group1" 
"Tab2", "Group2" 
"Tab1", "Group3" 

FieldDetail:(TabGroupBox.Name ,Name,FieldStatus)

"Group1", "Field1", "Good1" 
"Group2", "Field2", "Good2" 
"Group3", "Field3", "Bad" 
"Group1", "Field4", "Good3" 
"Group1", "Field5", "Bad" 

如果該標準是爲FieldStatus含有「好」,然後我在尋找的結果是:

Tab1 
-Group1 
--Field1 
--Field4 
Tab2 
-Group2 
--Field2 

然而,此刻只能似乎得到任何

Field1 
Field2 
Field4 

0123:對應的字段

Tab1 
Tab1 
Tab2 

我不工作的查詢的樣本標籤的重複

我也試着利用的.Include()但沒有成功

此外,如果可能的話,我想在DB模式投射到查詢中我的視圖模型,但這並不是如上述一樣重要。

+0

看起來應該使用Common Table Expression創建數據庫視圖並將視圖映射到EF。 – MarcinJuraszek

+0

@MarcinJuraszek你的建議如何解決我的問題?我可以在Sql和Linq中加入一個查詢,這個查詢給了我一個簡單的表格,但那不是我所追求的。 – PostureOfLearning

+0

哎GRT問題-deceptively簡單,直到你看到你想要的下部葉片的一個子集返回的事實。我的直覺說,LINQ可能成爲累贅要做到這一點,但從來沒有說永遠 - 讓我有鑽研 –

回答

0

您可以做的最好的是以下幾點。

context.FieldDetails 
     .Include(fieldDetail => fieldDetail.GroupBox.Tab) // Use eager loading. 
     .Where(fieldDetail => fieldDetail.FieldDetailType.Contains("Good"))) 
     .AsEnumerable() // We will do the remaining work client side. 
     .Select(fieldDetail => fieldDetail.GroupBox.Tab) 
     .Distinct() // Get rid of duplicate tabs. 
     .ToList() 

什麼是不容易有可能是部分地檢索相關的entites的集合,例如僅Group1但不Group3Tab1。如果你能做到這一點,會導致一些頭痛。如果您提交Tab1更改,該怎麼辦? Group3是否應該被刪除,因爲它不存在於組的集合中?它應該留下,因爲你沒有加載它在第一個地方?如果您思考一段時間,您會意識到部分加載相關實體集合的能力會增加很多複雜性,並且在某些情況下會使行爲非常不直觀。

如果這還不夠,您可能可以在數據庫中創建視圖或函數,並將它們映射到您的模型,但我沒有使用實體框架超過兩年,沒有遵循開發,所以我不能爲您提供更多詳細信息如何解決此問題。