Вычисление такого рода вещей путем подсчета узлов в древовидной структуре довольно глупо, вы будете выполнять вычисления после привязки его к элементу пользовательского интерфейса.
В данном конкретном случае, я тоже не любитель делать это с помощью 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 |
_____________________________________________________________________________
Зачем изобретать колеса здесь? Вы используете .net 3.5+, и вам следует попробовать использовать LINQ to SQL, чтобы он создавал для вас правильную модель. Ответ на ваш вопрос будет рекурсивно перемещаться по дереву членов комиссии. – xandy