Linq 用另一个值替换列值

pie*_*mes 1 c# linq replace

好吧,我正在执行 linq 查询以获取具有相同列的结果列表,然后我需要用新值替换该列值。

第一个代码:

var db = GetContext();
var result = from f in GetContext().ProjectStateHistories
             where f.ProjectId.Equals(oldProjectId)
             select f;

foreach (var item in result)
{
     var projectStateHistoryUpdate = db.ProjectStateHistories.Find(item.Id);
     projectStateHistoryUpdate.ProjectId = newProjectId;
     db.Entry(projectStateHistoryUpdate).State = EntityState.Modified;
}
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

我搜索了一些答案,我发现我可以使用 Select,并创建一个新对象(Linq 用另一个值替换 null/空值

第二个代码:

var result = (from f in GetContext().ProjectStateHistories
              where f.ProjectId.Equals(oldProjectId)
              select f).Select(d=> new { Id = d.Id, EventName = d.EventName, LogUser = d.LogUser, ProjectId = newProjectId, TimeStamp = d.TimeStamp });
Run Code Online (Sandbox Code Playgroud)

甚至,第三个代码:

var db = GetContext();
var result = (from f in db.ProjectStateHistories
              where f.ProjectId.Equals(oldProjectId)
              select f).Select(d=> new { ProjectId = newProjectId});
Run Code Online (Sandbox Code Playgroud)

但只有第一个代码有效

我想问一下我做错了什么,因为我认为最好使用查询更改值,而不是使用 foreach。

Ria*_*nli 5

见下面的代码:

var db = GetContext();
(from f in db.ProjectStateHistories
     where f.ProjectId.Equals(oldProjectId)
     select f)
       .ToList()
       .ForEach(i => i.ProjectId = newProjectId);
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

或者:

var db = GetContext();
db.ProjectStateHistories
       .Where(f => f.ProjectId.Equals(oldProjectId))
       .ToList()
       .ForEach(f => f.ProjectId = newProjectId);
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)