2011-10-09 13 views
0

私はMVC 3プロジェクトを作成していますが、私はエンティティフレームワークを使用しています。私はバルクデータベースエントリを生成するメソッドを書いています。これはクライアントの請求書用です。このシステムは大学のためのもので、各学生はEnrollmentsクラスの特定の教師と一緒に登録されます。この登録の月額料金は登録に保存されます。請求書メソッドは請求書を生成するために正しく機能しますが、現在私は大学の教員用の手数料伝票のデータベースエントリを生成することを検討しています。このメソッドは、(Enrollmentsクラスを介して)各チューターに登録されたすべての生徒を見つけて、この量を蓄積する必要があります。この合計金額には、チューターが受け取る手数料の割合が乗算されます。これはCommissionAmountになります。私はこれのためのコードを書く方法が不明です。これらは、関連するモデルクラスです:バルクデータベースエントリ - 計算委員会

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 long 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 TutorCommissionPercentage 
{ 
    [Key] 
    public int TutorCommissionID { get; set; } 
    public long TutorNoID { get; set; } 
    [Range(0, 100, ErrorMessage="Percentage must be between 0 and 100")] 
    [Display(Name="Commission Percentage")] 
    public decimal CommissionPercentage { get; set; } 

    public virtual Tutor Tutor { get; set; } 
} 

生成する請求書のコードは以下の通りです:

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

     var enrolments = db.Enrollments.ToList(); 

     var newInvoices = from enrolment in enrolments 
          select new Invoices() 
          { 
           InvoiceAmount = enrolment.MonthlyFee, 
           InvoiceMonth = month, // string constant 
           InvoiceStatus = "Unpaid", 
           ClientNumberID = enrolment.ClientNumberID 
          }; 

     foreach (var newInvoice in newInvoices) 
     { 
      db.Invoice.Add(newInvoice); 
      db.SaveChanges(); 
     } 

     return RedirectToAction("Index"); 
    } 

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

} 

マネージャは一つのリンクをクリックして生成することができるように、これらのバルクデータベースの入力方法の目的がありますデータベース内のすべてのクライアントおよびチューターの請求書およびコミッション通知。

それはすべてあなたが家庭教師によって加入契約し、コミッションし、グループに参加する必要がある1つの文で終らのおかげでエイミー

答えて

0

。使用しているよう

この最初の例では、クエリ構文を使用しています。

 IEnumerable<TutorCommission> tutorsCommissions = 
      from enrollment in enrollments // Take the enrollments 
      join tutorsCommissionPercentage in tutorCommissionPercentages // Join with the tutor's commission percentages. 
       on enrollment.TutorNoID equals tutorsCommissionPercentage.TutorNoID 
      group enrollment by new { enrollment.TutorNoID, tutorsCommissionPercentage.CommissionPercentage } into enrollmentsAndCommissionByTutor // group enrollments and commission by the tutor 
      select new TutorCommission 
      { 
       TutorNoID = enrollmentsAndCommissionByTutor.Key.TutorNoID, // the grouping which is the tutor 
       CommissionAmount = (long) enrollmentsAndCommissionByTutor.Sum(e => e.MonthlyFee * enrollmentsAndCommissionByTutor.Key.CommissionPercentage) 
      }; 

この第二の例はもう少し直感的にこの操作

 IEnumerable<TutorCommission> tutorsCommissionsAlt = enrollments // Take the enrollments 
      .GroupJoin(// This will group enrollments by the tutor 
       tutorCommissionPercentages, // 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.CommissionPercentage * e.MonthlyFee) 
       }); 
+0

こんにちは、あなたの答えに感謝のためにあるメソッド構文を使用しています。私はTutorCommissionPercentageを個別に持つのではなく、Tutorのプロパティにしました。 TutorCommissionPercentageをTutorのプロパティとして使用する最初のメソッド構文を教えてください。これは私が必要とするすべてのコードですか、それともループを組み込む必要がありますか? – Amy

+0

"tutor(s)CommissionPercentage"を "tutor(s)"に置き換えてください。それはすべて動作するはずです。新しいクラスを投稿すると、Q&Aの一貫性を保つことができるように、私があなたに見せたいと思うなら、私はそれに答えます。作成した各エントリをデータベースに追加するには、ループが必要です(バルク挿入はありません)。 – Steve

+0

ありがとう、上記のTutorクラスを追加しました。 TutorCommissionPercentageが2倍の理由は、前のコードで10進数と2倍の倍数の問題があったためです。しかし、パーセンテージが今チューターであれば、私はまだ "参加"が必要でしょうか? – Amy

関連する問題