【问题标题】:Batching Entity Framework queries for more efficiency批处理实体框架查询以提高效率
【发布时间】:2019-03-30 16:51:49
【问题描述】:

如果我有下面的代码 sn-p 在每个循环上查询数据库,有没有办法通过只运行一次查询并传入列表或集合来提高效率?

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

【问题讨论】:

    标签: entity-framework linq-to-entities


    【解决方案1】:

    你可以重构这个方法。只会对数据库执行两次查询,而不是 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();
    

    【讨论】:

    • 但这会提高效率还是只是改变执行方式?
    • 只有 两个 查询而不是 balanceTransactions.Count + 1,查询越少性能越好
    • 我有点担心出现错误的部分。该区域将如何处理?
    • 具体关注点是什么?如果条件和整个部分将在内存中进行评估。
    • 什么是 '!existedIds.Contains(x.Id)' 看起来不正确
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    相关资源
    最近更新 更多