2011-09-05 72 views
4

我需要一個數據庫,該數據庫以一個名爲「User」的表格開頭,該表格需要自我引用,並且具有相關對象的非常深的圖形。它需要像下面圖片的左側(忽略右側)。實體框架和自引用表

enter image description here

我還需要通過這個圖形向上和向下,以百分比計算,總計等換句話說,我需要travese在某些情況下,整個圖形遍歷。

這是可能的和/或它是如何完成的?在LINQ語句中可以遍歷遍歷嗎?例子?

編輯: 基本上,我試圖創建一個網絡營銷方案,並需要計算每個人的收入。

例子:

  1. 爲了能夠calulate特定用戶根據每個用戶的總銷售額(因此每個用戶將有某種形式的收入進來)。
  2. 在樹一定水平計算佣金(例如,如果頂人有3人在他們下面$ 1每銷售一個產品,佣金率爲50%,那麼將是$ 1.50)
  3. 如果我質疑上圖中(左)爲 「B」 我應該得到 「B,H,I,J,N,O」

希望幫助:S

+0

寫一些例子你有什麼exacly需要。 –

+0

@Piotr - 請參閱我的編輯 – Ryan

+1

查看[使用LINQ搜索樹](http:// stackoverflow。com/questions/7062882/searching-a-tree-using-linq) – Eranga

回答

3

無法遍歷整個樹只使用LINQ的方式可以轉換爲單個SQL查詢(或它們的常數)。您可以使用每個級別的一個查詢或一個查詢來完成此操作,這僅限於特定數量的級別(但這樣的查詢在許多級別上會變得非常大)。

在T-SQL中(我假設你使用的是MS SQL Server),你可以使用recursive common table expressions來做到這一點。應該可以將它放入一個存儲過程,您可以使用它從LINQ獲取您實際需要的信息。

綜上所述,你的選擇是:

  1. 不要使用LINQ,只需用遞歸CTE
  2. 使用遞歸CTE SQL存儲過程從LINQ
  3. 使用LINQ,創建一個查詢每個級別
  4. 使用醜陋的LINQ查詢只限於幾級
+0

這個遞歸CTE能夠處理3^30 +級別的數據嗎? – Ryan

+3

你真的意味着3^30的水平?這是一個非常巨大的數字。如果一個級別只需要一個字節,那麼整棵樹就會有187TB。 – svick

+0

好點...我可能不需要3^30,但可能更像3^16。這將是一個n-ary,所以它不會是完全3^16 +,但它可以得到那麼高...順便說一句,我只是用3^10試了一下,查詢花了8分鐘以上運行。 – Ryan