微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Foreach 循环的问题

如何解决使用 Foreach 循环的问题

我正在尝试使用 Foreach 循环来计算那些在我的申请中发放贷款的人支付的利息。应用程序加载所有已发放贷款的列表,那些贷款帐户余额小于零的贷款将被借记还款。如果此人只收到一次贷款,则运行正常,但如果他收到两次或三次,则贷款对所有三个实例都使用相同的旧余额。

代码如下:

DateTime WATTime = Timezones.WATTimezone();  //Calling the Timezone method from class to use the West Central Africa Timezone 

        var date = DateTime.Today;
        var zone = TimeZoneInfo.FindSystemTimeZoneById("W. Central Africa Standard Time");

        // var presentDates = date.Date;  // das;
        DateTime currentTime = TimeZoneInfo.ConvertTime(date,zone);

        var loanDates = currentTime.Date;
        var loanDate = loanDates.ToShortDateString();


        List<LoanProcessed> loanProcessed = (from l in db.LoanProcesseds
                                             where l.first_Repayment_Date.Equals(loanDate)
                                             || l.second_Repayment_Date.Equals(loanDate)
                                             || l.third_Repayment_Date.Equals(loanDate)
                                             || l.fourth_Repayment_Date.Equals(loanDate)
                                             || l.fifth_Repayment_Date.Equals(loanDate)
                                             || l.sixth_Repayment_Date.Equals(loanDate)
                                             || l.seventh_Repayment_Date.Equals(loanDate)
                                             || l.eighth_Repayment_Date.Equals(loanDate)
                                             || l.Ninth_Repayment_Date.Equals(loanDate)
                                             || l.Tenth_Repayment_Date.Equals(loanDate)
                                             || l.Eleventh_Repayment_Date.Equals(loanDate)
                                             || l.Twelfth_Repayment_Date.Equals(loanDate)

                                             select l
                                             ).ToList();


        foreach (var item in loanProcessed)
        {

            var loan_Accountdetails = db.LoanAccounts.Where(c => c.Account_Number == item.Account_Number).FirstOrDefault();
            var loan_AccountBalance = db.LoanAccounts.Where(a => a.Account_Number == loan_Accountdetails.Account_Number).FirstOrDefault().Account_Balance;

            // Handling First Repayment
            var firstRepay = item.first_Repayment_Date;
            if (loan_AccountBalance < 0)
            {
                //continue;
                if (firstRepay != "Nill" && firstRepay != "")
                {

                    if (DateTime.ParseExact(firstRepay,"dd/MM/yyyy",CultureInfo.InvariantCulture).Date == WATTime.Date)
                    {
                        // Credit the Loan Account with the Monthly Repayment
                        try
                        {

                            var principalRepayment = item.Monthly_Repayment;

                            // Retrieve Current Account Balance First

                            var old_LoanBalance = db.LoanAccounts.Where(a => a.Account_Number == loan_Accountdetails.Account_Number).FirstOrDefault().Account_Balance;
                            var new_LoanBalance = old_LoanBalance + principalRepayment;
                            // Update the LoanAccount Balance First
                            using (var db1 = new CreditFacilityContext())
                            {
                                var result = db1.LoanAccounts.SingleOrDefault(b => b.Account_Number == item.Account_Number);
                                if (result != null)
                                {
                                    result.Account_Balance = new_LoanBalance;
                                    db1.SaveChanges();
                                }
                            }
}
// Debit the Current Account with the Monthly Repayment
                        try
                        {
                            var currentAccountDetails = db.CurrentAccounts.Where(b => b.Account_Number == loan_Accountdetails.Current_AccountNumber).FirstOrDefault();

                            var principalRepayment = item.Monthly_Repayment;
                            var old_CurrentAccountBalance = db.CurrentAccounts.Where(a => a.Account_Number == loan_Accountdetails.Current_AccountNumber).FirstOrDefault().Account_Balance;
                            var new_CurrentAccountBalance = old_CurrentAccountBalance - principalRepayment;
                            // Update the CurrentAccount Balance First
                            string connString = ConfigurationManager.ConnectionStrings["CreditFacilityContext"].ConnectionString;
                            sqlTransaction transaction1;
                            using (sqlConnection connection = new sqlConnection(connString))
                            {
                                using (sqlCommand command = new sqlCommand())
                                {
                                    connection.open();
                                    command.Connection = connection;
                                    transaction1 = connection.BeginTransaction(IsolationLevel.Serializable);
                                    command.CommandType = CommandType.Text;
                                    command.Transaction = transaction1;
                                    command.CommandText = "UPDATE CurrentAccounts SET Account_Balance=@Account_Balance WHERE (Account_Number=@Account_Number)";
                                    command.Parameters.Add("@Account_Balance",sqlDbType.Decimal).Value = new_CurrentAccountBalance;
                                    command.Parameters.Add("@Account_Number",sqlDbType.NVarChar).Value = loan_Accountdetails.Current_AccountNumber;

                                    try
                                    {

                                        transaction1.Commit();
                                        int recordsAffected = command.ExecuteNonQuery();

                                    }
                                    catch (sqlException d)
                                    {
                                        Console.Write(d.Message,"Error in Saving");
                                    }
                                    finally
                                    {
                                        connection.Close();
                                    }

                                }

                            }

                    }
                }
            }

如果一个帐号在 loanprocessed 中出现一次,它工作正常,但如果出现两次,它将使用相同的 old_loanBalance 所有出现,有一个代码来更新 LoanAccount但如果它不止一个,它似乎不起作用。

// Update the LoanAccount Balance First
                        using (var db1 = new CreditFacilityContext())
                        {
                            var result = db1.LoanAccounts.SingleOrDefault(b => b.Account_Number == item.Account_Number);
                            if (result != null)
                            {
                                result.Account_Balance = new_LoanBalance;
                                db1.SaveChanges();
                            }
                        }

解决方法

您正在使用相同的 DbContext 实例来获取 old_LoanBalance

var old_LoanBalance = db.LoanAccounts
    .Where(a => a.Account_Number == loan_Accountdetails.Account_Number)
    .FirstOrDefault()
    .Account_Balance;

您似乎启用了跟踪,因此当您请求同一实体时,它实际上不会第二次访问数据库。您可以尝试使用 ReloadAsync:

重新加载它
await dbContext.Entry(old_LoanBalance).ReloadAsync();

UPD

您还可以选中 if entity was already loaded 以防止多次不必要地访问数据库:

var existingInContext = db.LoanAccounts
    .Local
    .FirstOrDefault(a => a.Account_Number == loan_Accountdetails.Account_Number);

if(existingInContext != null) db.Entry(existingInContext).Reload();

var old_LoanBalance = db.LoanAccounts
    .Where(a => a.Account_Number == loan_Accountdetails.Account_Number)
    .FirstOrDefault()
    .Account_Balance;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。