C# 如何根据所引用的成员计算佣金?

C# 如何根据所引用的成员计算佣金?,c#,wpf,treeview,C#,Wpf,Treeview,我正在为一家从事连锁系统业务的咨询公司开发一个C#WPF小软件。我对树结构进行了编码,以显示谁引用了谁。现在它有佣金取决于级别。如果1提及2和3,则1将获得1级佣金。如果2号提交4号、5号和3号提交6号、7号,则1号将获得2级佣金。这条链将继续到一定的总数。我的问题是如何实现这个逻辑;我能够计算出谁通过UDF推荐了多少成员,这些成员是为向TreeView添加TreeView而编写的。或者告诉我如何在特定级别计算treeview中的项目节点添加自定义项: 我使用的是MySQL,它有表成员,包括列i

我正在为一家从事连锁系统业务的咨询公司开发一个C#WPF小软件。我对树结构进行了编码,以显示谁引用了谁。现在它有佣金取决于级别。如果1提及2和3,则1将获得1级佣金。如果2号提交4号、5号和3号提交6号、7号,则1号将获得2级佣金。这条链将继续到一定的总数。我的问题是如何实现这个逻辑;我能够计算出谁通过UDF推荐了多少成员,这些成员是为向TreeView添加TreeView而编写的。或者告诉我如何在特定级别计算treeview中的项目节点添加自定义项:

我使用的是MySQL,它有表成员,包括列id、fullname和refercode

public void AddNodes(int uid, TreeViewItem tSubNode)
    {
        string query = "select fullname, id from members where refCode=" + uid + ";";
        MySqlCommand cmd = new MySqlCommand(query, db.conn);
        MySqlDataAdapter _DA = new MySqlDataAdapter(cmd);
        DataTable _DT = new DataTable();
        tSubNode.IsExpanded = true;
        _DA.Fill(_DT);

        foreach (DataRow _dr in _DT.Rows)
        {
            TreeViewItem tNode = new TreeViewItem();                
            tNode.Header = _dr["fullname"].ToString()+" ("+_dr["id"].ToString()+")";                
            tSubNode.Items.Add(tNode);

            if (db.HasMembers(Convert.ToInt32(_dr["id"].ToString())))
            {
                AddNodes(Convert.ToInt32(_dr["id"]), tNode);
            }
        }
        //This line tracks who has referred how many members
        Console.WriteLine("Tree node Count : "+tSubNode.Items.Count.ToString()+", UID "+uid);                       
    }

请帮帮我

通过计算树视图中的节点来计算这类事情是非常愚蠢的,您将在将其绑定到UI元素后进行计算

在这种情况下,我也不喜欢使用LINQ,虽然LINQ会做得很好,但它有以下缺点:

  • 在可能的情况下,您应该让数据库服务器来完成这项艰巨的工作,这就是它的目的
  • 如果在将来的某个阶段添加或更改级别,这意味着您还有几个位置需要重构
  • 对数据库存储过程进行更改比对编译代码进行更改更容易
您尚未指定要使用的数据库,我将假定为SQL。 如果您在数据库中的自引用表中有人员的姓名和引用他们的人的关键字,那么您应该能够轻松地计算出这一点

您的桌子将如下所示:

int             RecordID
varchar(100)    Name
int             ReferrerID
_____________________________________________________________________________
| 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       |
_____________________________________________________________________________
然后对于数据,它将如下所示(使用上面的示例):

我还将使用一个名为
Levels
的表,其中包含每个级别的佣金金额。在本表中,我为每个1级转诊分配0.50,为每个2级转诊分配0.25:

int    LevelID
money  LevelAmount  
现在,使用自引用表,您可以通过将其自身连接两次来计算level 1和level 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             
我把声明整理了一下,并加了几个列名。这将生成如下所示的结果集:

int             RecordID
varchar(100)    Name
int             ReferrerID
_____________________________________________________________________________
| 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       |
_____________________________________________________________________________

为什么要在这里重新发明轮子?您正在使用.NET3.5+,是否应该尝试使用LINQtoSQL,以便它为您构建正确的模型。您的问题的答案将是递归导航成员佣金树。