循环C#后一一添加到模型中

问题描述 投票:0回答:1

我有这样的代码:

var subQuerytrue = from trd in _context.TrdSbphtms
                   where trd.Sell == false && trd.TrdOhDp == request.KodeDp
                   group trd by trd.TrdOhKode into g
                   select new { TRD_OH_Kode = g.Key, SisaNominal = g.Sum(x => x.SisaNominal) };

var equery = (from a in subQuerytrue
         join mobl in _context.Mobls on a.TRD_OH_Kode equals mobl.MoblCode into moblGroup
         from m in moblGroup.DefaultIfEmpty()
         where m.MoblMaturityDate > td
         select new 
         {
             PIHAK = m.MoblIssuer ?? "",
             NAMAINVESTASI = a.TRD_OH_Kode ?? "",
             TGLJATUHTEMPO = m.MoblMaturityDate,
             SUKUBUNGA = m.MoblInterest ?? 0,
             HARIDIAKUI = m.MoblJangka * 30,
             HARITAHUN = 360,
             JANGKA = m.MoblJangka ?? 0,
             TGLTERBIT = m.MoblIssuedDate,
             TGLBUNGA = m.MoblTanggalBunga ?? 0,
             SISANOMINAL = a.SisaNominal ?? 0,
             MOBLCODE = m.MoblCode ?? ""
         }).ToList();

if (equery.Any())
{
    foreach (var item in equery)
    {
        jangka = item.JANGKA;
        DateTime defaultDate = new(2000, 1, 1);
        DateTime? ptgljthtempo = item.TGLJATUHTEMPO;
        DateTime? ptglterbit = item.TGLTERBIT;
        int? ptglbunga = item.TGLBUNGA;
        double? psisanominal = item.SISANOMINAL;
        string? pnamainvestasi = item.NAMAINVESTASI;
        string? MOBLCODE = item.MOBLCODE;

        int monthsDifference = ((ptgljthtempo ?? defaultDate).Year - (ptglterbit ?? defaultDate).Year) * 12 + (ptgljthtempo ?? defaultDate).Month - (ptgljthtempo ?? defaultDate).Month;
        max_pay = monthsDifference / jangka;

        if (ptglterbit != null)
        {
            int monthsDiff = ((td.Year - ptglterbit.Value.Year) * 12) + td.Month - ptglterbit.Value.Month;
            if (monthsDifference % jangka == 0)
            {
                bayar_ke = monthsDiff / jangka;
            }
            else
            {
                bayar_ke = 0;
            }
        }

        if (bayar_ke > 0)
        {
            if (ptglbunga != null)
            {
                DateTime targetDate = new((request.Periode ?? defaultDate).Year, (request.Periode ?? defaultDate).Month, (int)ptglbunga);

                var rs3 = (from trd in _context.TrdSbphtmSells where trd.TglBeli > targetDate && trd.TrdOhKode == MOBLCODE select trd.Nominal).Sum();
                bnghitung = jangka * (int)ptglbunga * ((psisanominal ?? 0) - (rs3 > 0 ? rs3.Value ?? 0 : 0)) / 1200;
                bng = 0;
                tglbunga = new DateTime((request.PeriodTo ?? defaultDate).Year, (request.PeriodTo ?? defaultDate).Month, (int)ptglbunga);
                Nom = 0;

                var rs3true = (from trd in _context.TrdSbphtms where trd.TglBeli > tglbunga && trd.TrdOhKode == pnamainvestasi
                               group trd by 1 into g select new { a = g.Sum(x => x.SisaNominal), b = g.Sum(x => x.Nominal) }).FirstOrDefault();

                Nom = rs3true?.a ?? 0;

                var rs4true = (from trd in _context.TrdSbphtmSells where trd.TglBeli > tglbunga && trd.TrdOhKode == pnamainvestasi
                               group trd by 1 into g select new { a = g.Sum(x => x.SisaNominal), b = g.Sum(x => x.Nominal) }).FirstOrDefault();

                Nom += rs4true?.a ?? 0;

                if (bnghitung > 0)
                {
                    var detailquery = equery.Select(s => new
                    {
                        s.PIHAK,
                        s.NAMAINVESTASI,
                        TGLJATUHTEMPO = tglbunga,
                        NILAINOMINAL = (psisanominal - Nom) == 0 ? rs4true?.b * -1 : psisanominal - Nom,
                        s.SUKUBUNGA,
                        s.HARIDIAKUI,
                        s.HARITAHUN,
                        BUNGAHITUNG = bnghitung,
                        BUNGAREAL = bng,
                        TANGGALTERIMA = tglbunga,
                        Keterangan = bayar_ke + " dari " + max_pay
                    });

                    // DETAIL
                    model.ReportBungaRealSBPDetails = detailquery.Where(w => w.BUNGAHITUNG > 0).Select(s => new ReportBungaRealSBPDetail
                    {
                        PIHAK = s.PIHAK,
                        NAMAINVESTASI = s.NAMAINVESTASI,
                        TGLJATUHTEMPO = s.TGLJATUHTEMPO,
                        NILAINOMINAL = s.NILAINOMINAL,
                        SUKUBUNGA = s.SUKUBUNGA,
                        HARIDIAKUI = s.HARIDIAKUI,
                        HARITAHUN = s.HARITAHUN,
                        BUNGAHITUNG = s.BUNGAHITUNG,
                        BUNGAREAL = s.BUNGAREAL,
                        TANGGALTERIMA = s.TANGGALTERIMA,
                        Keterangan = s.Keterangan
                    }).ToList();
                }
            }                            
        }
    }
}

结果应该只有 2 条记录,且 bnghitung > 0。
我的问题是,当我调试时。 model.ReportBungaRealSBPDetails正在获取equery的所有结果,即39条记录。并且所有记录的“bnghitung”都变得相同。 为什么?仅当满足条件时,我才想添加到 model.ReportBungaRealSBPDetails 中。上面的代码有什么问题吗?

需要建议请。
谢谢你。

c# linq entity-framework-core
1个回答
0
投票

好吧,这就是我的看法:

如果当您之前计算了几行的 bnghitung 时,您会进入这个, 是 > 0。但是,然后您用 equery 中包含的每个实例填充详细查询,并且 给每个实例相同的值。这意味着详细查询中的所有记录都符合 bnghitung > 0 的条件。

我无法给你一个正确的解决方案,因为我不太确定你希望这件事如何结束。所以我只是包括我认为出错的代码空间。

if (bnghitung > 0)
{
    var detailquery = equery.Select(s => new
    {
        s.PIHAK,
        s.NAMAINVESTASI,
        TGLJATUHTEMPO = tglbunga,
        NILAINOMINAL = (psisanominal - Nom) == 0 ? rs4true?.b * -1 : psisanominal - Nom,
        s.SUKUBUNGA,
        s.HARIDIAKUI,
        s.HARITAHUN,
        BUNGAHITUNG = bnghitung, //this is the issue
        BUNGAREAL = bng,
        TANGGALTERIMA = tglbunga,
        Keterangan = bayar_ke + " dari " + max_pay
    });

    // DETAIL
    model.ReportBungaRealSBPDetails = detailquery.Where(w => w.BUNGAHITUNG > 0).Select(s => new ReportBungaRealSBPDetail
    {
        PIHAK = s.PIHAK,
        NAMAINVESTASI = s.NAMAINVESTASI,
        TGLJATUHTEMPO = s.TGLJATUHTEMPO,
        NILAINOMINAL = s.NILAINOMINAL,
        SUKUBUNGA = s.SUKUBUNGA,
        HARIDIAKUI = s.HARIDIAKUI,
        HARITAHUN = s.HARITAHUN,
        BUNGAHITUNG = s.BUNGAHITUNG,
        BUNGAREAL = s.BUNGAREAL,
        TANGGALTERIMA = s.TANGGALTERIMA,
        Keterangan = s.Keterangan
    }).ToList();
}
© www.soinside.com 2019 - 2024. All rights reserved.