【问题标题】:Database Calculations - MVC 3 and CodeFirst数据库计算 - MVC 3 和 CodeFirst
【发布时间】:2011-10-11 19:35:04
【问题描述】:

我正在尝试编写一个生成多个佣金单的方法。这是针对一所大学的,在该大学中,客户在名为 Enrollments 的课程中​​与导师一起注册。通过这种方法,我试图累积导师客户的月费乘以他们的佣金百分比,因为导师从他们的课程中赚取一定的佣金。这是我的代码:

public ActionResult CreateBulkCommissions()
{
var month = DateTime.Now.ToString("MMMM");

var enrolments = db.Enrollments.ToList();

var newCommissions = from enrolment in enrolments
                     select new TutorCommission()
                     {
                         CommissionAmount = enrolment.MonthlyFee,
                         CommissionMonth = month,  // string constant 
                         CommissionStatus = "Unpaid",
                         Tutor = enrolment.Tutor
                     };
foreach (var newCommission in newCommissions)
{
    List<TutorCommission> TutorComs = newCommissions.GroupBy(g => g.Tutor).Select(s => new TutorCommission
    {
        CommissionAmount = s.Sum(u => u.CommissionAmount) * s.Key.TutorCommissionPercentage,
        TutorNoID = s.Key.TutorNoID

    }).ToList();

    db.TutorCommission.Add(newCommission);
    db.SaveChanges();
}

return RedirectToAction("Index");
}

问题是 TutorCommission 条目是为每个单独的注册创建的,而不是每个导师(当月)一个条目以及总佣金金额。 IE。 Ashley 有 3 个客户,因此正在为他创建 3 个注册和当前 3 个 TutorCommission 条目。我想将一个条目的注册量相加。此外,该金额没有乘以佣金百分比,因此只是节省了全额注册月费。相关类是:

public class Enrollment
{
    [Key]
    [Display(Name = "Enrollment ID Number")]
    public long EnrollmentIDNumber { get; set; }
    [Display(Name = "Client ID Number")]
    public long ClientNumberID { get; set; }
    [Display(Name = "Tutor ID Number")]
    public long TutorNoID { get; set; }
    [Display(Name = "Course Name")]
    public string CourseName { get; set; }
    [Display(Name = "Lesson Time")]
    public string LessonTime { get; set; }
    [Display(Name = "Lesson Day")]
    public string LessonDay { get; set; }
    [Display(Name = "Lesson Location")]
    public string LessonLocation { get; set; }
    [Display(Name = "Lesson Type")]
    public string LessonType { get; set; }
    [Display(Name = "Lesson Level")]
    public string LessonLevel { get; set; }
    [Display(Name = "Monthly Fee")]
    public long MonthlyFee { get; set; }

    public virtual Client Client { get; set; }
    public virtual Tutor Tutor { get; set; }

}

public class TutorCommission
{
    [Key]
    [Display(Name = "Commission ID")]
    public long CommissionID { get; set; }
    [Display(Name = "Commission Month")]
    public string CommissionMonth {get; set;}
    [Display(Name = "Commission Amount")]
    public double CommissionAmount { get; set; }
    [Display(Name = "Commission Status")]
    public string CommissionStatus { get; set; }
    [Display(Name = "Tutor ID Number")]
    public long TutorNoID { get; set; }

    public virtual Tutor Tutor { get; set; }
    public virtual ICollection<CommissionPayments> CommissionPayments { get; set; }

}

public class Tutor
{
    [Key]
    [Display(Name = "Tutor ID Number")]
    public long TutorNoID { get; set; }
    [Required]
    [StringLength(50, ErrorMessage="First name must be less than 50 characters")]
    [Display(Name = "First Name")]
    public string TutorFirstName { get; set; }
    [StringLength(50, ErrorMessage = "Last name must be less than 50 characters")]
    [Display(Name = "Last Name")]
    public string TutorLastName { get; set; }
    [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
    [Display(Name = "Birth Date")]
    public DateTime? TutorBirthDate { get; set; }
    [Display(Name = "Cellphone Number")]
    public string TutorCellphoneNumber { get; set; }
    [Display(Name = "Home Number")]
    public string TutorHomeNumber { get; set; }
    [RegularExpression("^[a-z0-9_\\+-]+(\\.[a-z0-9_\\+-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*\\.([a-z]{2,4})$", ErrorMessage = "Not a valid email address")]
    [Display(Name = "Email Address")]
    public string TutorEmailAddress { get; set; }
    [Display(Name = "Street Address")]
    public string TutorStreetAddress { get; set; }
    [Display(Name = "Suburb")]
    public string TutorSuburb { get; set; }
    [Display(Name = "City")]
    public string TutorCity { get; set; }
    [Display(Name = "Postal Code")]
    public string TutorPostalCode { get; set; }
    [Display(Name="Full Name")]
    public string FullName
    {
        get
        {
            return TutorFirstName + " " + TutorLastName;
        }
    }
    [Display(Name="Commission Percentage")]
    [Required]
    public double TutorCommissionPercentage { get; set; }

    public virtual ICollection<Enrollment> Enrollments { get; set; }
    public virtual ICollection<TutorCommission> TutorCommissions { get; set; }

}

谢谢, 艾米

【问题讨论】:

标签: c# asp.net-mvc-3 ef-code-first


【解决方案1】:

您可以尝试将分组逻辑移到 foreach 循环之外,然后在分组列表上进行迭代。所以不是

foreach (var newCommission in newCommissions)
{
    List<TutorCommission> TutorComs = newCommissions.GroupBy(g => g.Tutor).Select(s => new TutorCommission
    {
        CommissionAmount = s.Sum(u => u.CommissionAmount) * s.Key.TutorCommissionPercentage,
        TutorNoID = s.Key.TutorNoID

    }).ToList();

    db.TutorCommission.Add(newCommission);
    db.SaveChanges();
}

试试

List<TutorCommission> TutorComs = newCommissions.GroupBy(g => g.Tutor).Select(s => new TutorCommission
    {
        CommissionAmount = s.Sum(u => u.CommissionAmount) * s.Key.TutorCommissionPercentage,
        TutorNoID = s.Key.TutorNoID

    }).ToList();

foreach (var tutorCom in TutorComs)
{    
    db.TutorCommission.Add(tutorCom);
    db.SaveChanges();
}

看看这是否更接近预期的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多