【问题标题】:Take Last VchNo and Group by Month and Sum Total Amount in Entity Framework取最后一个 VchNo 和按月分组并在实体框架中求和总金额
【发布时间】:2021-07-20 19:27:59
【问题描述】:
public partial class FeesVoucher
    {
        public long Auto_id { get; set; }
        public string VoucherNo { get; set; }
        public string StudentID { get; set; }
        public string SessionID { get; set; }
        public string ClassID { get; set; }
        public string SectionID { get; set; }
        public Nullable<System.DateTime> IssueDate { get; set; }
        public Nullable<System.DateTime> DueDate { get; set; }
        public Nullable<System.DateTime> FeesDate { get; set; }
        public string FeeMonth { get; set; }
        public string FeeYear { get; set; }
        public Nullable<decimal> RegistrationFee { get; set; }
        public Nullable<decimal> AdmissionFee { get; set; }
        public Nullable<decimal> SecurityDeposit { get; set; }
        public Nullable<decimal> TutionFee { get; set; }
        public Nullable<decimal> Fine_Late_Fee { get; set; }
        public Nullable<decimal> TransportCharges { get; set; }
        public Nullable<decimal> Lab_ExaminationFee { get; set; }
        public Nullable<decimal> AnnualCharges { get; set; }
        public Nullable<decimal> BoardPECFee { get; set; }
        public Nullable<decimal> OtherCharges { get; set; }
        public Nullable<decimal> TotalAmount { get; set; }
        public string FeesStatus { get; set; }
        public string PaidType { get; set; }
        public string CampusID { get; set; }
        public string FeesID { get; set; }
        public string VoucherMessages { get; set; }
        public string CreatedBy { get; set; }
        public Nullable<System.DateTime> CreatedDate { get; set; }
        public string LastUpdateBy { get; set; }
        public Nullable<System.DateTime> LastUpdated { get; set; }
        public string EditMsg { get; set; }
        public string IsEdit { get; set; }
        public string RevAcc { get; set; }
        public string RecAcc { get; set; }
    }

using (Entities db = new Entities())
                    {

                        var dt = (from stu in db.StudentsInfoes
                                  join CampusS in db.CampusSetups on stu.CampusID equals CampusS.CampusID
                                  join stuclass in db.StudentClassInfoes on stu.StudentID equals stuclass.StudentID
                                  join sectionID in db.ClassesSections on stuclass.ClassID equals sectionID.ClassID
                                  join classs in db.ClassSetups on stuclass.ClassID equals classs.ClassID
                                  join SessS in db.SessionsSetups on stuclass.SessionID equals SessS.SessionID
                                  join FeeV in db.FeesVouchers on stu.StudentID equals FeeV.StudentID 
                                  
                                  

                                  select new
                                  {

                                      StudentID = stu.StudentID,
                                      FullName = stu.FullName,
                                      FatherName = stu.FatherName,
                                      StStatus = stu.Status,
                                      ClassStatus = stuclass.Status,
                                      CampusID = CampusS.CampusID,
                                      RollNo = stuclass.RollNo,
                                      ClassID = stuclass.ClassID,
                                      ClassDesc = classs.ClassDesc,
                                      SectionID = sectionID.SectionID,
                                      SectionDesc = sectionID.SectionDesc,
                                      VoucherNo = FeeV.VoucherNo,
                                      SessionID = SessS.SessionID,
                                      Months = FeeV.FeeMonth,
                                      RegistrationFee = FeeV.RegistrationFee,
                                      AdmissionFee = FeeV.AdmissionFee,
                                      AnnualCharges = FeeV.AnnualCharges,
                                      SecurityDeposit = FeeV.SecurityDeposit,
                                      Fine_Late_Fee = FeeV.Fine_Late_Fee,
                                      BoardPECFee = FeeV.BoardPECFee,
                                      Lab_ExaminationFee = 
                                      FeeV.Lab_ExaminationFee,
                                      OtherCharges = FeeV.OtherCharges,
                                      TutionFee = FeeV.TutionFee,
                                      IssueDate = FeeV.IssueDate,
                                      DueDate = FeeV.DueDate,
                                      
                                      TotalAmount = FeeV.TotalAmount,
                                      FeeStatus = FeeV.FeesStatus,
                                      FeeYear = FeeV.FeeYear,
                                      FeesID = FeeV.FeesID,

                                  }

                              ).Where(x => x.FeeStatus.Equals("unpaid")).Select(x => new {x.VoucherNo,x.FullName,x.IssueDate,x.DueDate,x.Months,x.TotalAmount }).Distinct().ToList();

这个查询在没有分组和求和的情况下完美地工作,如图所示 ===> Without Group and Sum Picture 在多个表加入此查询后生成这样的结果

VchNo Student Name Month Total Amount
0001 aa Jan 2000
0002 aa Feb 2000
0003 aa Mar 2000
0004 bb Jan 2000
0005 bb Feb 2000
0006 bb Mar 2000

但我想修改我的查询以实现分组和求和,如图所示 ===>With Group and Sum Picture 但我想取最后一个 VchNo 并按月分组并像这样总结总金额

VchNo Student Name Month Total Amount
0003 aa Jan,Feb,Mar 6000
0006 bb Jan,Feb,Mar 6000

实体框架 6.0 的查询是什么 所有答案将不胜感激

【问题讨论】:

    标签: c# entity-framework group-by linq-to-entities


    【解决方案1】:

    见下文:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    
    
    namespace ConsoleApplication
    {
        public class Program
        {
            
            public static void Main(string[] args)
            {
                DataTable dt = new DataTable();
                dt.Columns.Add("VchNo", typeof(string));
                dt.Columns.Add("Student Name", typeof(string));
                dt.Columns.Add("Month", typeof(string));
                dt.Columns.Add("Total Amount", typeof(int));
    
                dt.Rows.Add(new object[] { "0001", "aa", "Jan", 2000 });
                dt.Rows.Add(new object[] { "0002", "aa", "Feb", 2000 });
                dt.Rows.Add(new object[] { "0003", "aa", "Mar", 2000 });
                dt.Rows.Add(new object[] { "0004", "bb", "Jan", 2000 });
                dt.Rows.Add(new object[] { "0005", "bb", "Feb", 2000 });
                dt.Rows.Add(new object[] { "0006", "bb", "Mar", 2000 });
    
                DataTable dt2 = dt.Clone();
    
                var groups = dt.AsEnumerable().GroupBy(x => x.Field<string>("Student Name")).ToList();
    
                foreach (var group in groups)
                {
                    dt2.Rows.Add(new object[] {
                        group.Select(x => x.Field<string>("VchNo")).LastOrDefault(),
                        group.Key,
                        string.Join(",", group.Select(XmlReadMode => XmlReadMode.Field<string>("Month"))),
                        group.Sum(x => x.Field<int>("Total Amount"))
                    });
                }
    
            }
        }
    
    }
    

    使用实体:

        class Program
        {
            static void Main(string[] args)
            {
    
                using (Entities db = new Entities())
                {
    
                    var dt = (from stu in db.StudentsInfoes
                              join CampusS in db.CampusSetups on stu.CampusID equals CampusS.CampusID
                              join stuclass in db.StudentClassInfoes on stu.StudentID equals stuclass.StudentID
                              join sectionID in db.ClassesSections on stuclass.ClassID equals sectionID.ClassID
                              join classs in db.ClassSetups on stuclass.ClassID equals classs.ClassID
                              join SessS in db.SessionsSetups on stuclass.SessionID equals SessS.SessionID
                              join FeeV in db.FeesVouchers on stu.StudentID equals FeeV.StudentID
    
                              select new
                              {
    
                                  StudentID = stu.StudentID,
                                  FullName = stu.FullName,
                                  FatherName = stu.FatherName,
                                  StStatus = stu.Status,
                                  ClassStatus = stuclass.Status,
                                  CampusID = CampusS.CampusID,
                                  RollNo = stuclass.RollNo,
                                  ClassID = stuclass.ClassID,
                                  ClassDesc = classs.ClassDesc,
                                  SectionID = sectionID.SectionID,
                                  SectionDesc = sectionID.SectionDesc,
                                  VoucherNo = FeeV.VoucherNo,
                                  SessionID = SessS.SessionID,
                                  Months = FeeV.FeeMonth,
                                  RegistrationFee = FeeV.RegistrationFee,
                                  AdmissionFee = FeeV.AdmissionFee,
                                  AnnualCharges = FeeV.AnnualCharges,
                                  SecurityDeposit = FeeV.SecurityDeposit,
                                  Fine_Late_Fee = FeeV.Fine_Late_Fee,
                                  BoardPECFee = FeeV.BoardPECFee,
                                  Lab_ExaminationFee =
                                  FeeV.Lab_ExaminationFee,
                                  OtherCharges = FeeV.OtherCharges,
                                  TutionFee = FeeV.TutionFee,
                                  IssueDate = FeeV.IssueDate,
                                  DueDate = FeeV.DueDate,
    
                                  TotalAmount = FeeV.TotalAmount,
                                  FeeStatus = FeeV.FeesStatus,
                                  FeeYear = FeeV.FeeYear,
                                  FeesID = FeeV.FeesID,
    
                              }
    
                          ).Where(x => x.FeeStatus.Equals("unpaid")).Select(x => new { x.VoucherNo, x.FullName, x.IssueDate, x.DueDate, x.Months, x.TotalAmount }).Distinct().ToList();
    
                    var results = dt.GroupBy(x => x.FullName).Select(x => new
                    {
                        VchNo = x.Last().VoucherNo,
                        Name = x.Key,
                        Months = string.Join(",", x.Select(y => y.Months)),
                        Amount = x.Sum(y => y.TotalAmount)
    
                    }).ToList();
                }
            }
        }
        public class Entities : IDisposable
        {
            public List<CampusSetups> CampusSetups { get; set; }
            public List<ClassSetups> ClassSetups { get; set; }
            public List<ClassesSections> ClassesSections { get; set; }
            public List<FeesVoucher> FeesVouchers { get; set; }
            public string SectionsSetups { get; set; }
            public List<StudentsInfoes> StudentsInfoes { get; set; }
            public List<StudentClassInfoes> StudentClassInfoes { get; set; }
            public List<SessionsSetups> SessionsSetups { get; set; }
    
            public void Dispose()
            {
            }
        }
        public class ClassSetups
        {
            public string ClassID { get; set; }
            public string ClassDesc { get; set; }
        }
        public class ClassesSections
        {
            public string ClassID { get; set; }
            public string SectionDesc { get; set; }
            public string SectionID { get; set; }
        }
        public class SessionsSetups
        {
            public string SessionID { get; set; }
        }
        public class StudentClassInfoes
        {
            public string StudentID { get; set; }
            public string ClassID { get; set; }
            public string SessionID { get; set; }
            public string RollNo { get; set; }
            public string Status { get; set; }
        }
        public class CampusSetups
        {
            public string CampusID { get; set; }
        }
        public class StudentsInfoes
        {
            public string CampusID { get; set; }
            public string StudentID { get; set; }
            public string FatherName { get; set; }
            public string FullName { get; set; }
            public string Status { get; set; }
        }
        public partial class FeesVoucher
        {
            public long Auto_id { get; set; }
            public string VoucherNo { get; set; }
            public string StudentID { get; set; }
            public string SessionID { get; set; }
            public string ClassID { get; set; }
            public string SectionID { get; set; }
            public Nullable<System.DateTime> IssueDate { get; set; }
            public Nullable<System.DateTime> DueDate { get; set; }
            public Nullable<System.DateTime> FeesDate { get; set; }
            public string FeeMonth { get; set; }
            public string FeeYear { get; set; }
            public Nullable<decimal> RegistrationFee { get; set; }
            public Nullable<decimal> AdmissionFee { get; set; }
            public Nullable<decimal> SecurityDeposit { get; set; }
            public Nullable<decimal> TutionFee { get; set; }
            public Nullable<decimal> Fine_Late_Fee { get; set; }
            public Nullable<decimal> TransportCharges { get; set; }
            public Nullable<decimal> Lab_ExaminationFee { get; set; }
            public Nullable<decimal> AnnualCharges { get; set; }
            public Nullable<decimal> BoardPECFee { get; set; }
            public Nullable<decimal> OtherCharges { get; set; }
            public Nullable<decimal> TotalAmount { get; set; }
            public string FeesStatus { get; set; }
            public string PaidType { get; set; }
            public string CampusID { get; set; }
            public string FeesID { get; set; }
            public string VoucherMessages { get; set; }
            public string CreatedBy { get; set; }
            public Nullable<System.DateTime> CreatedDate { get; set; }
            public string LastUpdateBy { get; set; }
            public Nullable<System.DateTime> LastUpdated { get; set; }
            public string EditMsg { get; set; }
            public string IsEdit { get; set; }
            public string RevAcc { get; set; }
            public string RecAcc { get; set; }
        }
    

    【讨论】:

    • 非常感谢自定义数据表。我想要关于 LINQ 或实体框架上下文的任何建议!
    • Linq 是一个查询,并不意味着将数据添加到数据表中。代码很容易转换为实体。
    • 谢谢,兄弟。问题已更新。现在您可以为我提出更好的解决方案吗?
    • Distinct 真的有效吗?您需要以下内容才能工作:docs.microsoft.com/en-us/dotnet/api/…
    • 添加实体解决方案
    【解决方案2】:

    也许是这样的

    collection.GroupBy(x => x.StudentName).Select(g =>
      new{
        g.Last().VchNo,
        g.Last().StudentName,
        Month = string.Join(',', g.Select(gg => g.Month)),
        TotalAmount = g.Sum(gg => g.TotalAmount)
      }
    );
    

    我猜到了属性名称,因为您没有包含它们。修改代码以替换您的实际实体名称

    【讨论】:

    • g.Month 和 g.TotalAmount 显示错误“不包含 Month 和 TotalAmount 的定义
    • 您没有指定您的客户端属性名称是什么(但它们肯定不能包含空格!)您只是说数据库表的样子(您的列名真的包含空格??) .您必须将它们更改为您的实际属性名称。如果您没有在问题中提供完整的信息,您通常必须接受答案可能无法直接复制粘贴;仍然需要你的努力
    • 非常感谢。我已经用代码和两张图片更新了我的问题。现在你可以建议我更好的查询。
    猜你喜欢
    • 2020-07-24
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多