通过计算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