Расчет такого рода вещей путем подсчета узлов в древовидном представлении довольно глуп, вы будете выполнять вычисления после привязки его к элементу пользовательского интерфейса.
В этом конкретном случае я также не фанат делать это с помощью LINQ, в то время как LINQ будет делать это очень хорошо, у него есть следующие недостатки:
- вы должны позволить серверу баз данных выполнять тяжелую работу где это возможно , это то, что нужно для
- если уровни будут добавлены или изменены на каком-то этапе в будущем, это означает, что у вас есть еще несколько мест, требующих рефакторинга
- может быть проще развернуть изменение в хранимой процедуре базы данных, чем изменение скомпилированного кода
Вы не указали, какую базу данных вы используете, я предполагаю, что 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 для каждого реферала уровня 2:
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
Все, что я делаю, - это присоединяюсь к самой таблице для каждого возможного уровня комиссии. Если бы вы вводили комиссию для рефералов 3-го уровня, вы просто добавили бы еще одно объединение.
Если вы запустите это утверждение, вы заметите, однако, что 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 |
_____________________________________________________________________________