You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键说明:

  1. 表关联:通过KlinikKasaHareket.FisKodu与KlinikFis.FisKodu建立关联,确保每个流水对应到正确的单据。
  2. 差值计算:对每个关联后的记录计算(Fis.ToplamTutar ?? 0) - (Hareket.Tutar ?? 0),用?? 0处理空值避免运算错误。
  3. 汇总求和:将所有差值汇总,得到该 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:24:56