Search code examples
c#winformslinqentity-framework-coredevexpress

Querying in 3 tables with Entity Framework Core


With the code below, I can make transactions with data from 2 tables. How can I integrate a 3rd table into this code. I want to calculate the differences between the Total Amount in the KlinikFis table and the Amount in the KlinikKasaHareket table as KasaninAlacaklari. After the calculation process, I will display it as a column.

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

Solution

  • This is not final query. I'm not good in Turkish, please explain which difference do you need and how to join (which fields) third table with this result.

    public object KasaListele(NetStokContext context)
    {
        var query = 
            from kasa in context.KlinikKasalar
            join h in context.KlinikKasaHareketleri on kasa.KasaKodu equals h.KasaKodu
            group h by new 
            {
                kasa.Id,
                kasa.KasaKodu,
                kasa.KasaAdi,
                kasa.YetkiliKodu,
                kasa.YetkiliAdi,
                kasa.Aciklama            
            } into g
            select new 
            {
                g.Key,
                
                KasaGiris = g.Sum(c.Hareket == "Kasa Giriş" ? c.Tutar : 0) ?? 0,
                KasaCikis = g.Sum(c.Hareket == "Kasa Çıkış" ? c.Tutar : 0) ?? 0,
                KasaninAlacaklari = g.Sum(c.Hareket == "Kasanın Alacakları" ? c.Tutar : 0) ?? 0,
            } into s
            select new 
            {
                s.Key.Id,
                s.Key.KasaKodu,
                s.Key.KasaAdi,
                s.Key.YetkiliKodu,
                s.Key.YetkiliAdi,
                s.Key.Aciklama,            
    
                s.KasaGiris,
                s.KasaCikis,
                s.KasaninAlacaklari,
    
                Bakiye = s.KasaGiris - s.KasaCikis
            };
    
        var result = query.ToList();
    
        return result;
    }