通過計算treeview中的節點來計算這種事情是非常愚蠢的,你將在綁定到UI元素後進行計算。
在這種特殊情況下,我也沒有使用LINQ做它的粉絲,而LINQ會做的非常好,它有以下缺點:
- 你應該讓數據庫服務器做拼搏如果可能的話,它是什麼它是
- 如果水平增加或在未來的某個階段改變,這意味着你有幾個是需要重構
- 多個位置可以更容易推出一個更改爲數據庫存儲過程,而不是編譯代碼
01的更改
你還沒有指定你正在使用的數據庫,我將假設SQL。 如果您有人員名稱和誰引用他們在數據庫中的自引用表中的關鍵,您應該很容易能夠計算出來。
你的表格看起來就像這樣:
int RecordID
varchar(100) Name
int ReferrerID
那麼對於數據會看起來像這樣(用你的例子從上面):
_______________________________________________
| RecordID | Name | ReferrerID |
_______________________________________________
| 1 | Person 1 | null |
| 2 | Person 2 | 1 |
| 3 | Person 3 | 1 |
| 4 | Person 4 | 2 |
| 5 | Person 5 | 2 |
| 6 | Person 6 | 3 |
| 7 | Person 7 | 3 |
_______________________________________________
我也將使用一個表稱爲Levels
包含每個級別的佣金數額。在這個表我對每個二級轉診分配0.50每級1轉介,和0.25:
int LevelID
money LevelAmount
現在用你的自我引用表,就可以計算出你通過加入它需要的1級和2級本身兩次。這個SQL會給你的初始表:
SELECT p.RecordID
,p.PersonName
,Level1Referral.PersonName
,Level1Commission.LevelAmount
,Level2Referral.PersonName
,Level2Commission.LevelAmount
FROM People p
LEFT JOIN People Level1Referral
ON Level1Referral.ReferrerID = p.RecordID
LEFT JOIN Levels Level1Commission
ON Level1Referral.ReferrerID IS NOT NULL
AND Level1Commission.LevelID = 1
LEFT JOIN People Level2Referral
ON Level2Referral.ReferrerID = Level1Referral.RecordID
LEFT JOIN Levels Level2Commission
ON Level2Referral.ReferrerID IS NOT NULL
AND Level2Commission.LevelID = 2
我要做的就是加入了桌子上本身對每個可能的佣金水平,如果你要引入一個委員會第三級轉介,你想補充另一個加盟。
如果您運行此聲明,您會注意到雖然Level1Referral.PersonName
對於每個2級推介都有重複條目,但這並不是最優的,並且不容易將其與分組排除在外。然而,我們可以做的是有一個周圍的SELECT語句並對其應用一些分組,並在此過程中計算每個級別的佣金數量。下面是最後一條SQL語句,它可以滿足你的需求:
SELECT CommissionEarnerID
,CommissionEarnerName
,COUNT(DISTINCT L1Referral) AS [Number Of L1 Referrals]
,COUNT(DISTINCT L1Referral)
* (SELECT LevelAmount
FROM Levels
WHERE LevelID = 1) AS [Level 1 Commission]
,COUNT(DISTINCT L2Referral) AS [Number Of L2 Referrals]
,COUNT(DISTINCT L2Referral)
* (SELECT LevelAmount
FROM Levels
WHERE LevelID = 2) AS [Level 2 Commission]
FROM (
SELECT p.RecordID AS CommissionEarnerID
,p.PersonName AS CommissionEarnerName
,Level1Referral.RecordID AS L1Referral
,Level1Referral.PersonName AS L1ReferralName
,Level2Referral.RecordID AS L2Referral
,Level2Referral.PersonName AS L2ReferralName
FROM People p
LEFT JOIN People Level1Referral
ON Level1Referral.ReferrerID = p.RecordID
LEFT JOIN People Level2Referral
ON Level2Referral.ReferrerID = Level1Referral.RecordID
) x
GROUP BY CommissionEarnerID
,CommissionEarnerName
我整理了一下這個聲明,並加入了一些列名。這產生如下結果集:
_____________________________________________________________________________
| Commission | Commission | Number | Level 1 | Number | Level 2 |
| Earner ID | Earner | of L1 | Commission | of L2 | Commission |
| | Name | Referrals | | Referrals | |
_____________________________________________________________________________
| 1 | Person 1 | 2 | 1.00 | 4 | 1.00 |
| 2 | Person 2 | 2 | 1.00 | 0 | 0.00 |
| 3 | Person 3 | 2 | 1.00 | 0 | 0.00 |
| 4 | Person 4 | 0 | 0.00 | 0 | 0.00 |
| 5 | Person 5 | 0 | 0.00 | 0 | 0.00 |
| 6 | Person 6 | 0 | 0.00 | 0 | 0.00 |
| 7 | Person 7 | 0 | 0.00 | 0 | 0.00 |
_____________________________________________________________________________
爲什麼要在這裏重新發明輪子?您正在使用.net 3.5+,並且應該嘗試使用LINQ to SQL,以便爲您構建正確的模型。您的問題的答案是遞歸導航成員佣金樹。 – xandy 2010-03-27 06:52:45