使用循环和 If 语句 C# 从列表中删除对象
Remove Object From List With Loop and If Statement C#
我有一个 DTO:
public class UserDTO
{
public int uid {get;set;}
public string name {get;set;}
}
// example of what the udto gets as a request from the front-end
var theList = new List<UserDTO>()
{
new UserDTO { uid = 1, name = "Bob Smith" },
new UserDTO { uid = 2, name = "Jane Jones" },
};
在数据库中:Bob 的状态为 0,而 Janes 在数据库中不存在。因此循环检查用户是否存在状态为 0,如果存在,则使用 _myCtx.Update() 将数据库状态从 0 更新为 1。然后一旦更新,它会删除 Bob 的对象,因为我不想复制 Bob,因为他已经存在,我需要删除 Bobs 对象,然后继续下一个循环,它将 Jane 添加到数据库中。
public async Task<IActionResult> AddUser([FromBody] List<UserDTO> udto)
{
var toRemove = new HashSet<UserDTO>();
foreach(var item in udto)
{
var userFalse = await _myCtx.Users.SingleOrDefaultAsync(o => o.uid == item.uid && o.status == 0);
if(userFalse != null) // if user found, I want to update
{
item.Status = 1;
_myCtx.Users.Update(userFalse);
await _myCtx.SaveChanges(); //save into the DB the status to 1
if(item.uid == userFalse.uid){ toRemove.Add(item); } //need Bob removed here
} // below I want to add if they don't exist
udto.RemoveAll(toRemove.Contains);
item.name = udto.name;
var myEntity = _mapper.Map(item);
await _myCtx.Users.AddAsync(myEntity);
// Jane gets added, but so does Bob as a duplicate
}
await _myCtx.SaveChangesAsync();
return Ok("User Added");
}
项目在循环完成后被删除,以及将其添加到数据库的原因。有没有办法在 Bob 在 if 子句之后或内部继续之前删除它,这样它就不会被添加到数据库中?谢谢大家
您的代码似乎在迭代集合时正在修改集合。这不可能发生。
虽然您可以轻松删除循环。
在我看来,您正在尝试这样做:
var uids = udto.Select(x => x.uid).ToArray();
var users =
_myCtx
.Users
.Where(x => x.status == 0)
.Where(x => uids.Contains(x.uid))
.ToArray();
foreach (var user in users)
{
user.status = 1;
}
await _myCtx.SaveChanges();
var uids2 = users.Select(x => x.uid).ToArray();
udto.RemoveAll(x => uids2.Contains(x.uid));
我有一个 DTO:
public class UserDTO
{
public int uid {get;set;}
public string name {get;set;}
}
// example of what the udto gets as a request from the front-end
var theList = new List<UserDTO>()
{
new UserDTO { uid = 1, name = "Bob Smith" },
new UserDTO { uid = 2, name = "Jane Jones" },
};
在数据库中:Bob 的状态为 0,而 Janes 在数据库中不存在。因此循环检查用户是否存在状态为 0,如果存在,则使用 _myCtx.Update() 将数据库状态从 0 更新为 1。然后一旦更新,它会删除 Bob 的对象,因为我不想复制 Bob,因为他已经存在,我需要删除 Bobs 对象,然后继续下一个循环,它将 Jane 添加到数据库中。
public async Task<IActionResult> AddUser([FromBody] List<UserDTO> udto)
{
var toRemove = new HashSet<UserDTO>();
foreach(var item in udto)
{
var userFalse = await _myCtx.Users.SingleOrDefaultAsync(o => o.uid == item.uid && o.status == 0);
if(userFalse != null) // if user found, I want to update
{
item.Status = 1;
_myCtx.Users.Update(userFalse);
await _myCtx.SaveChanges(); //save into the DB the status to 1
if(item.uid == userFalse.uid){ toRemove.Add(item); } //need Bob removed here
} // below I want to add if they don't exist
udto.RemoveAll(toRemove.Contains);
item.name = udto.name;
var myEntity = _mapper.Map(item);
await _myCtx.Users.AddAsync(myEntity);
// Jane gets added, but so does Bob as a duplicate
}
await _myCtx.SaveChangesAsync();
return Ok("User Added");
}
项目在循环完成后被删除,以及将其添加到数据库的原因。有没有办法在 Bob 在 if 子句之后或内部继续之前删除它,这样它就不会被添加到数据库中?谢谢大家
您的代码似乎在迭代集合时正在修改集合。这不可能发生。
虽然您可以轻松删除循环。
在我看来,您正在尝试这样做:
var uids = udto.Select(x => x.uid).ToArray();
var users =
_myCtx
.Users
.Where(x => x.status == 0)
.Where(x => uids.Contains(x.uid))
.ToArray();
foreach (var user in users)
{
user.status = 1;
}
await _myCtx.SaveChanges();
var uids2 = users.Select(x => x.uid).ToArray();
udto.RemoveAll(x => uids2.Contains(x.uid));