循环遍历 sql 结果并删除单行

Posted

技术标签:

【中文标题】循环遍历 sql 结果并删除单行【英文标题】:loop through sql results and delete the single rows 【发布时间】:2022-01-08 18:57:21 【问题描述】:

我试图通过 for 循环从列表中删除人员。我现在的问题是我试图找到每个 id 来删除我的数据库的特定行,但我不知道如何使用 for 循环来做到这一点。

我现在的代码:

[HttpPost("delUebertrag/")]
        public async Task<ActionResult<ProzessPersonenzuordnungen>> delRecUebertrag([FromBody] recUebertragModel user)
        
            ProzessPersonenzuordnungen ppz = new();
            for (var i = 0; i <= user.personList.Length; i++)
            
                Guid personId = new Guid(user.personList[i]);
                ppz.ProzessId = new Guid(user.prozessId);
                var prozessPersonenzuordnungen = _context.ProzessPersonenzuordnungens.Where(p => p.ProzessId == ppz.ProzessId && p.PersonId == personId);

                if (prozessPersonenzuordnungen == null)
                
                    return NotFound();
                
                //Everythings works fine above, prozessPersonenzuordnungen haves for Example 2 results
                for(var j = 0; j < prozessPersonenzuordnungen.Count(); j++) // i dont know if Counts is fine, looking for something like length of the results
                
                    var toDeletingRow = await _context.ProzessPersonenzuordnungens.FindAsync(prozessPersonenzuordnungen.Select(p => p.ProzessPersonenzuordnungId)); // Here i need to go through every singleId of my results, something like p.ProzessPersonenzuordnungId[j](does not work) 
                    _context.ProzessPersonenzuordnungens.Remove(toDeletingRow);
                    await _context.SaveChangesAsync();
                
               
            
            return Ok();
        

【问题讨论】:

【参考方案1】:

FindAsync 只能用于单个项目。而是这样做

var rowsToDelete = _context.ProzessPersonenzuordnungens.Where(x=> prozessPersonenzuordnungen.Select(p => p.ProzessPersonenzuordnungId).Contains(x.Id));

使用移除而不是移除

_context.ProzessPersonenzuordnungens.RemoveRange(rowsToDelete);

还有一点很重要,循环访问数据库是一种非常糟糕的做法。 尝试不使用循环。

编辑:

试试这个

ProzessPersonenzuordnungen ppz = new ProzessPersonenzuordnungen();
        for (var i = 0; i <= user.personList.Length; i++)
        
            Guid personId = new Guid(user.personList[i]);
            ppz.ProzessId = new Guid(user.prozessId);
            var prozessPersonenzuordnungen = _context.ProzessPersonenzuordnungens.Where(p => p.ProzessId == ppz.ProzessId && p.PersonId == personId)
                .Select((x)=> x.ProzessPersonenzuordnungId);

            if (prozessPersonenzuordnungen == null)
            
                return NotFound();
            

            var rowsToDelete = _context.ProzessPersonenzuordnungens.Where(x => prozessPersonenzuordnungen.Contains(x.Id));
            _context.ProzessPersonenzuordnungens.RemoveRange(rowsToDelete);
            await _context.SaveChangesAsync();
            return Ok();
        

【讨论】:

Includes 在这种情况下不起作用。 “Guid 不包含包含的定义”。 @DeChopper,代替包含,尝试包含。它应该工作。 好的,我现在删除了 for 循环。 x.Id 不存在,所以我将其更改为 x.ProzessPersonenzuordnungId 仍然无法正常工作。 @DeChopper,我已经编辑了答案以包含整个部分。试试那个。 x.Id 仍然不存在,也尝试了其他一些方法仍然无法正常工作并抛出错误 500

以上是关于循环遍历 sql 结果并删除单行的主要内容,如果未能解决你的问题,请参考以下文章

循环遍历数组会返回不同的 SQL 结果,具体取决于代码

循环遍历数组并删除项目,而不会中断 for 循环

循环遍历 JavaScript 对象数组并删除值

Python循环列表删除元素问题

从 SQL 循环遍历(并显示)多个表行

循环遍历文本文件中的 SQL 查询并执行 - pyodbc