循环遍历 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 结果并删除单行的主要内容,如果未能解决你的问题,请参考以下文章