首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用.NetCore从数据库中删除大量数据

使用.NetCore从数据库中删除大量数据
EN

Stack Overflow用户
提问于 2021-09-13 10:17:42
回答 4查看 110关注 0票数 0

我正在尝试使用.netCore 2.1从数据库中删除超过5000条记录。我有下面的方法,它工作得很好,但是它需要太长的时间。

代码语言:javascript
复制
public async Task<bool> deleteAdhocDetails(int[] id)
{
    var status = false;

    for (var x = 0; x < id.Length; x++)
    {
        var existingReward = await _context.AdhocRewardInfo
            .Where(d => d.RowID == id[x])
            .FirstOrDefaultAsync<AdhocRewardInfo>();

        if ((existingReward != null) && (existingReward.HaloRewardCode != null))
        {
            try
            {
                //removing existingReward
                _context.AdhocRewardInfo.Remove(existingReward);
                await _context.SaveChangesAsync();
                status = true;
            }
            catch (Exception e)
            {
                throw e;
            }
        }
    }
    return status;
}            

我目前正在使用EFCore.BulkExtensions来插入记录,它工作得很好。我试过使用BulkDelete,但似乎没有什么不同。我也尝试过使用Z.EntityFramework.Extensions.EFCore,但也不能正常工作。我还应该提一下,我对此还是个新手。如果有人能给我指出正确的方向,我将不胜感激。谢谢

在adhoc.service.ts中:

代码语言:javascript
复制
deleteAdhocRecipients(id: number[]): Promise<boolean> {
    return this.http.put<boolean>(this.baseUrl + 'deleteAdhocDetails', id)
      .toPromise();
    }

在.ts文件中:

代码语言:javascript
复制
this.general
  .load(this.aService.deleteAdhocCampaign(this.adhocForm.get('create.id').value))
  .then(
    y => {
      if (deleteArr.length > 0) {
        this.general.load(this.aService.deleteAdhocRecipients(deleteArr))
          .then(
            f => this.router.navigate(['/adhoc-campaign/lookup'])
          );
      } else {
        this.router.navigate(['/adhoc-campaign/lookup']);
      }
    }
  );
EN

回答 4

Stack Overflow用户

发布于 2021-09-13 12:11:43

我优化了你的c#代码

代码语言:javascript
复制
public async Task<bool> deleteAdhocDetails(int[] id){
  try{
  var deletedRecords= await _context.AdhocRewardInfo.Where(d => 
  id.Contains(d.RowID))

  foreach (var item in deletedRecords)
  {
    _context.AdhocRewardInfo.Remove(item );
  }
  await _context.SaveChangesAsync();
  return true;
  }catch (Exception e){
    return false;
   }
 }
票数 0
EN

Stack Overflow用户

发布于 2021-09-13 12:31:32

您可以删除对对象的选择,然后只执行一次saveChanges

代码语言:javascript
复制
        public async Task<bool> deleteAdhocDetails((int id, object haloRewardCode)[] id)
        {
            try
            {
                for (var x = 0; x < id.Length; x++)
                {
                    var existingReward = new AdhocRewardInfo() { id = id[x].id, HaloRewardCode = id[x].haloRewardCode };

                    if ((existingReward != null) && (existingReward.HaloRewardCode != null))
                    {
                        //removing existingReward
                       _context.AdhocRewardInfo.Remove(existingReward);
                   }
                }
            }
            catch (Exception e)
            {
                throw;
            }

            await _context.SaveChangesAsync();
            return true;
        }
票数 0
EN

Stack Overflow用户

发布于 2021-09-15 14:41:18

我建议使用linq2db.EntityFrameworkCore (免责声明:我是创建者之一)。

Delete将会尽可能快:

代码语言:javascript
复制
var deletedCount = await _context.AdhocRewardInfo
    .Where(d => id.Contains(d.RowID))
    .DeleteAsync();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69161000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档