如何从父类中提取唯一的子类型和属性

时间:2013-11-30 18:55:42

标签: c# sql sql-server

方案说明:

我在c#中有一个名为“ Employee”的父类,几个子类从中继承。例如,“兼职”,“全职”和其他人继承自“员工”。

某个部门的所有员工都支付了基本工资,比如300美元。如果他们是全职的,他们将支付300美元的基本工资加上200美元的全职奖金。

我们有许多类别的员工,所有员工都可以获得300美元的基本信用额度以及根据其类别获得的独特奖金。

需要帮助的问题:

我正在尝试编写一个C#到SQL例程,它将该部门中的每个人增加300美元的每周信用额加上他们类别的唯一奖励。我已经有几个例程可以返回每月的员工名单及其与公司的常设帐户。 有没有办法只提取独特的类别?

dbo.PaymentRoutine
(@EmployeeClassification VARCHAR(50), @WeeklyPay DECIMAL(18,02))

UPDATE [Employee].Financial
set PaymentBalance += @UniqueBonus

我该怎么做?我可以手动输入我们在代码中的每个类别的工作人员并运行增量...但我希望有人可以用一个更少新手的解决方案来帮助我:) 有没有办法看看列表中的唯一子项是哪个<父类>并在这样的例程中访问这些孩子的属性?或者我是以错误的方式解决这个问题?提前感谢任何评论和帮助我学习。

1 个答案:

答案 0 :(得分:0)

除非您有充分的理由在C#中执行此操作,否则我认为您应该在SQL中完成所有工作。您将需要一个EmployeeType和一个Department表,以便您的PaymentRoutine存储过程可以从数据库中获取UniqueBonus,而不必乱用参数。然后,您可以使用这些表中的信息来获取所需的任何列表或报告。

如果确实需要在C#中执行此操作,则可以在基类上声明虚拟属性并在子类中覆盖它们。然后,您可以使用Linq查询所有员工的集合......

    [TestMethod]
    public void ListCategories()
    {
        var staff = new List<Employee>();
        staff.Add(new InvestmentBanker {Name="Fred Goodwin", Department = "NW"});
        staff.Add(new InvestmentBanker {Name="Nick Leeson", Department = "Barings"});
        staff.Add(new Cleaner{ Name = "George Formby", Department="NW" });

        var sb = new StringBuilder();
        foreach (var e in staff)
        {
            sb.Append(string.Format(
             "update Employee set PaymentBalance=PaymentBalance+{0}" + 
             " where Name='{1}'\r\n", 
             e.CategoryBonus, e.Name));                
        }

    }


}


public class Employee
{
    public string Department { get; set; }
    public string Name { get; set; }
    public virtual string Category { get { return "Employee"; } }
    public virtual decimal CategoryBonus { get { return 0; } }
}
public class Cleaner:Employee
{
    public override string Category {get { return "Cleaner"; }}
    public override decimal CategoryBonus{get { return 0.01M; }}
}
public class InvestmentBanker:Employee
{
    public override string Category { get { return "Banker"; } }
    public override decimal CategoryBonus { get { return 999999999999999M; } }        
}