使用Entity Framework Core实现三表查询及KasaninAlacaklari计算
如何集成KlinikFis表并计算KasaninAlacaklari
我当前用以下代码处理KlinikKasalar与KlinikKasaHareketleri表的数据操作,希望将KlinikFis表集成进来,计算KlinikFis.ToplamTutar与KlinikKasaHareket.Tutar的差值,以此作为KasaninAlacaklari列的取值。
现有代码
public object KasaListele(NetStokContext context) { var result = context.KlinikKasalar.GroupJoin(context.KlinikKasaHareketleri , c => c.KasaKodu, c => c.KasaKodu, (kasa, kasahareket) => new { kasa.Id, kasa.KasaKodu, kasa.KasaAdi, kasa.YetkiliKodu, kasa.YetkiliAdi, kasa.Aciklama, KasaGiris = (kasahareket.Where(c => c.KasaKodu == kasa.KasaKodu && c.Hareket == "Kasa Giriş").Sum(c => c.Tutar) ?? 0), KasaCikis = (kasahareket.Where(c => c.KasaKodu == kasa.KasaKodu && c.Hareket == "Kasa Çıkış").Sum(c => c.Tutar) ?? 0), KasaninAlacaklari = (kasahareket.Where(c => c.KasaKodu == kasa.KasaKodu && c.Hareket == "Kasanın Alacakları").Sum(c => c.Tutar) ?? 0) , Bakiye = (kasahareket.Where(c => c.KasaKodu == kasa.KasaKodu && c.Hareket == "Kasa Giriş").Sum(c => c.Tutar) ?? 0) - (kasahareket.Where(c => c.KasaKodu == kasa.KasaKodu && c.Hareket == "Kasa Çıkış").Sum(c => c.Tutar) ?? 0), }).ToList(); return result; }
实体类定义
public class KlinikFis : IEntity { public int Id { get; set; } public string FisKodu { get; set; } public string FisTuru { get; set; } public string HastaKodu { get; set; } public string HastaAdi { get; set; } public Nullable<decimal> ToplamTutar { get; set; } public string Aciklama { get; set; } } public class KlinikKasaHareket : IEntity { public int Id { get; set; } public string FisKodu { get; set; } public string Hareket { get; set; } public string KasaKodu { get; set; } public string KasaAdi { get; set; } public string HastaKodu { get; set; } public string HastaAdi { get; set; } public string HastaSoyadi { get; set; } public Nullable<DateTime> Tarih { get; set; } public Nullable<decimal> Tutar { get; set; } } public class KlinikKasa : IEntity { public int Id { get; set; } public string KasaKodu { get; set; } public string KasaAdi { get; set; } public string YetkiliKodu { get; set; } public string YetkiliAdi { get; set; } public string Aciklama { get; set; } }
解决方案
核心逻辑是通过FisKodu将KlinikKasaHareketleri与KlinikFis关联,计算每张单据的ToplamTutar - Tutar差值,再按KasaKodu汇总得到对应 Kasanın Alacakları。修改后的代码如下:
public object KasaListele(NetStokContext context) { var result = context.KlinikKasalar .GroupJoin(context.KlinikKasaHareketleri, kasa => kasa.KasaKodu, hareket => hareket.KasaKodu, (kasa, kasahareketler) => new { kasa.Id, kasa.KasaKodu, kasa.KasaAdi, kasa.YetkiliKodu, kasa.YetkiliAdi, kasa.Aciklama, KasaGiris = (kasahareketler.Where(h => h.Hareket == "Kasa Giriş").Sum(h => h.Tutar) ?? 0), KasaCikis = (kasahareketler.Where(h => h.Hareket == "Kasa Çıkış").Sum(h => h.Tutar) ?? 0), // 计算KasaninAlacaklari:关联Fis表后求差值总和 KasaninAlacaklari = kasahareketler .Join(context.KlinikFis, hareket => hareket.FisKodu, fis => fis.FisKodu, (hareket, fis) => (fis.ToplamTutar ?? 0) - (hareket.Tutar ?? 0)) .Sum() ?? 0, Bakiye = (kasahareketler.Where(h => h.Hareket == "Kasa Giriş").Sum(h => h.Tutar) ?? 0) - (kasahareketler.Where(h => h.Hareket == "Kasa Çıkış").Sum(h => h.Tutar) ?? 0) }) .ToList(); return result; }
关键说明:
- 表关联:通过
KlinikKasaHareket.FisKodu与KlinikFis.FisKodu建立关联,确保每个流水对应到正确的单据。 - 差值计算:对每个关联后的记录计算
(Fis.ToplamTutar ?? 0) - (Hareket.Tutar ?? 0),用?? 0处理空值避免运算错误。 - 汇总求和:将所有差值汇总,得到该 Kasanın Alacakları的总值。
如果需要只针对特定Hareket类型的流水计算(比如原代码中的"Kasanın Alacakları"),可以在Join前添加过滤条件:
KasaninAlacaklari = kasahareketler .Where(h => h.Hareket == "Kasanın Alacakları") // 仅针对指定流水类型计算 .Join(context.KlinikFis, hareket => hareket.FisKodu, fis => fis.FisKodu, (hareket, fis) => (fis.ToplamTutar ?? 0) - (hareket.Tutar ?? 0)) .Sum() ?? 0,
内容的提问来源于stack exchange,提问作者Erkan Kesemen
相关产品推荐
相关产品推荐

