I have this method where I am saving data into the database after doing a bit of evaluation. Within the foreach iteration I check whether conditions of are met before an object is assigned values then further inserted into the database. When the method runs it would only save one instance of eligibleSupplier into the database or throw IDENTITY_INSERT exception
public void EvaluationTenderBids(int tenderId)
{
var tender = _databaseContext.Tenders.Find(tenderId);
var submittedTenders = _databaseContext.TenderBidSubmissions.Where(t => t.TenderId == tenderId).ToList();
EligibleSupplier eligibleSupplier = new EligibleSupplier();
tender.EligibleSuppliers = new List<EligibleSupplier>();
var eligibleSuppliers = new List<EligibleSupplier>();
decimal totProductQtAmt = 0;
decimal totProductRecAmt = 0;
decimal priceDifference = 0;
foreach (var tenderBid in submittedTenders)
{
var tenderBidProducts = _databaseContext.TenderBidSubmissionProducts.Where(t => t.TenderBidSubmissionId == tenderBid.TenderBidSubmissionId).ToList();
foreach(var product in tenderBidProducts)
{
var prod = _databaseContext.Products.Find(product.ProductId);
product.RecommendedPrice = prod.ProductPrice;
totProductQtAmt = product.QuotedPrice * product.Quantity;
totProductRecAmt = product.RecommendedPrice * product.Quantity;
priceDifference = totProductQtAmt - totProductRecAmt;
}
var company = _databaseContext.TenderBidSubmissions.Where(c => c.RegistrationNumber == tenderBid.RegistrationNumber).FirstOrDefault();
decimal percentage = 0;
if (priceDifference > 0)
{
percentage = ((priceDifference / tenderBid.TotalQuotation) * 100);
}
if (percentage > 27 && percentage <= 30)
{
eligibleSupplier.RegistrationNumber = company.RegistrationNumber;
eligibleSupplier.CompanyName = company.CompanyName;
eligibleSupplier.Tender = tender;
eligibleSupplier.TenderId = tender.TenderId;
eligibleSupplier.Score = 1;
eligibleSupplier.InflationRate = percentage;
eligibleSupplier.DateEvaluated = DateTime.Now;
tender.EligibleSuppliers.Add(eligibleSupplier);
_databaseContext.SaveChanges();
}
else if (percentage > 21 && percentage <= 24)
{
eligibleSupplier.RegistrationNumber = company.RegistrationNumber;
eligibleSupplier.CompanyName = company.CompanyName;
eligibleSupplier.Tender = tender;
eligibleSupplier.TenderId = tender.TenderId;
eligibleSupplier.Score = 2;
eligibleSupplier.InflationRate = percentage;
eligibleSupplier.DateEvaluated = DateTime.Now;
tender.EligibleSuppliers.Add(eligibleSupplier);
_databaseContext.SaveChanges();
}
else if (percentage > 18 && percentage < 21)
{
eligibleSupplier.RegistrationNumber = company.RegistrationNumber;
eligibleSupplier.CompanyName = company.CompanyName;
eligibleSupplier.Tender = tender;
eligibleSupplier.TenderId = tender.TenderId;
eligibleSupplier.Score = 3;
eligibleSupplier.InflationRate = percentage;
eligibleSupplier.DateEvaluated = DateTime.Now;
tender.EligibleSuppliers.Add(eligibleSupplier);
_databaseContext.SaveChanges();
}
else if (percentage > 15 && percentage <= 18)
{
eligibleSupplier.RegistrationNumber = company.RegistrationNumber;
eligibleSupplier.CompanyName = company.CompanyName;
eligibleSupplier.Tender = tender;
eligibleSupplier.TenderId = tender.TenderId;
eligibleSupplier.Score = 4;
eligibleSupplier.InflationRate = percentage;
eligibleSupplier.DateEvaluated = DateTime.Now;
tender.EligibleSuppliers.Add(eligibleSupplier);
_databaseContext.SaveChanges();
}
else if (percentage > 10 && percentage <= 15)
{
eligibleSupplier.RegistrationNumber = company.RegistrationNumber;
eligibleSupplier.CompanyName = company.CompanyName;
eligibleSupplier.Tender = tender;
eligibleSupplier.TenderId = tender.TenderId;
eligibleSupplier.Score = 5;
eligibleSupplier.InflationRate = percentage;
eligibleSupplier.DateEvaluated = DateTime.Now;
tender.EligibleSuppliers.Add(eligibleSupplier);
_databaseContext.SaveChanges();
}
else
continue;
}
}