Пакетные запросы Entity Framework для большей эффективности - PullRequest
0 голосов
/ 26 октября 2018

Если у меня есть фрагмент кода ниже, который запрашивает базу данных в каждом цикле, есть ли способ сделать его более эффективным, выполнив запрос только один раз и передав список или коллекцию?

using (var dbContext = new YogabandyContext(ybDatabaseConnectionString))
{
    foreach (StripeBalanceTransaction transaction in balanceTransactions)
    {
        var profileCharge = dbContext.Charges.Where(i => i.BalanceTransactionId == transaction.Id).FirstOrDefault();

        if (profileCharge == null)
        {
            // do some error work
        }
        else
        {
            profileCharge.PayoutStatus = PayoutStatus.Succeeded;
            profileCharge.PayoutId = payoutId;
            profileCharge.PayoutObjectResponse = stripeEvent.StripeResponse.ObjectJson;
        }
    }

    dbContext.SaveChanges();
}

1 Ответ

0 голосов
/ 26 октября 2018

Вы можете изменить этот метод.Только два запроса будут выполнены к базе данных вместо balanceTransactions.Count + 1 раз:

var ids = balanceTransactions.Select(x => x.Id).ToList();

//first query
var profileCharges = dbContext.Charges
                         .Where(x => ids.Contains(x.BalanceTransactionId).ToList();

var existedIds = profileCharges.Select(x => x.BalanceTransactionId).ToList();
var notExisted = balanceTransactions.Where(x => !existedIds.Contains(x.Id)).ToList()
foreach(var transaction in notExisted)
{
    //do some error work
}

profileCharges.ForEach(x => 
{
     x.PayoutStatus = PayoutStatus.Succeeded;
     x.PayoutId = payoutId;
     x.PayoutObjectResponse = stripeEvent.StripeResponse.ObjectJson;
})

//second query
dbContext.SaveChanges();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...