c# - 1つのデータベースエントリの合計金額-MVC 3

原文 c# asp.net-mvc-3 ef-code-first

私は大学のシステムで家庭教師のコミッションスリップを生成する方法を書きました。チューターは、特定の学生に月額一定の料金で彼らを登録させており、彼らは彼らが与えるこれらのレッスンに対して手数料を稼いでいます。この方法では、チューターに属するすべての登録の合計金額を計算しようとしています(つまり、3人の学生がいて、各学生が月額R460に登録されている場合、合計金額は1380に手数料の割合を掛けたものになります)。したがって、この合計金額を使用して、データベースの先生ごとに1つの手数料伝票(TutorCommissionエンティティの1つのデータベースエントリ)を生成します。これのコードは次のとおりです。

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

    var enrolments = db.Enrollments.ToList();
    var tutor = db.Tutors.ToList();

    IEnumerable<TutorCommission> tutorsCommissionsAlt = enrolments // Take the enrollments
        .GroupJoin( // This will group enrollments by the tutor
            tutor, // Join with the tutor's commission percentages.
            e => e.TutorNoID, // Use tutorNoID for left Key
            tcp => tcp.TutorNoID, // ... and right key
            (e, tcp) => new TutorCommission // Create entry which is the tutor and his total commission
            {
                TutorNoID = e.TutorNoID,
                CommissionAmount = (long)tcp.Sum(c => c.TutorCommissionPercentage * e.MonthlyFee),
                CommissionMonth = month,  // string constant 
                CommissionStatus = "Unpaid",
            });

    foreach (var com in tutorsCommissionsAlt)
    {
        db.TutorCommission.Add(com);
        db.SaveChanges();
    }

    return RedirectToAction("Index");
}
        }


現時点では、このコードは登録ごとに新しいデータベースエントリを生成します(20の登録がある場合、月ごとに20のデータベースエントリが生成されます)。各チューターの1つのデータベースエントリに合計金額を入れるこのコードにどのような変更を加えることができますか?関連するクラスは次のとおりです。

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; }


おかげで、
エイミー
答え
コレクションの指定が間違っているようです-単一のチューターへの登録リストに参加する必要はありませんか?:

IEnumerable<TutorCommission> tutorsCommissionsAlt = enrolments.GroupJoin(tutor ...


する必要があります:

IEnumerable<TutorCommission> tutorsCommissionsAlt = tutor.GroupJoin(enrolments...


私はこのコードをまとめました、そしてそれはチェックアウトするようです:

        var month = DateTime.Now.ToString("MMMM");

        var enrolments = new List<Enrollment>();
        enrolments.Add(new Enrollment { TutorNoID = 1, MonthlyFee = 1500 });
        enrolments.Add(new Enrollment { TutorNoID = 1, MonthlyFee = 4500 });

        var tutor = new List<Tutor>();
        tutor.Add(new Tutor { TutorNoID = 1, TutorCommissionPercentage = 0.5 });


        IEnumerable<TutorCommission> tutorsCommissionsAlt = tutor.GroupJoin(enrolments,
                tut => tut.TutorNoID, 
                enr => enr.TutorNoID,
                (tut, enr) => new TutorCommission // Create entry which is the tutor and his total commission
                {
                    TutorNoID = tut.TutorNoID,
                    CommissionAmount = (long)enr.Sum(c => c.MonthlyFee * tut.TutorCommissionPercentage),
                    CommissionMonth = month,  // string constant 
                    CommissionStatus = "Unpaid",
                });


        foreach (var com in tutorsCommissionsAlt)
        {
            Console.WriteLine(com.CommissionAmount);
        }

// Output: 3000
関連記事

c# - C#バインドされたdatagridviewのmaskedtextbox列にリテラルを含めないようにするにはどうすればよいですか?

c# - 暗黙的なToList()呼び出しのNHibernateタイムアウト値の設定

c# - ItemsControlのScrollViewer-ScrollBarは表示されませんが機能します

c# - Google翻訳エラー

c# - プログラムでJREネットワーク設定を確認するにはどうすればよいですか?

c# - 新しい配列の要素にアクセスすると、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」が表示されるのはなぜですか?

c# - 他のすべてが機能しているときにオフラインデータベースを処理する

c# - SCOPE_IDENTITYが間違ったIDを返す

c# - Wpf Thumb Dragが他のコンポーネントでdrag Enterを起動しない

c# - プログラムでXFA(Adobe XML Forms Architecture)動的PDFを検出する方法