好吧,我正在做一个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();
我搜索了一些答案,我发现我可以使用Select,并创建一个新对象(Linq replace null/empty value with another value)
第二代码:
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 });
甚至,第三代码:
var db = GetContext();
var result = (from f in db.ProjectStateHistories
where f.ProjectId.Equals(oldProjectId)
select f).Select(d=> new { ProjectId = newProjectId});
但只有第一段代码。
我想问一下我做错了什么,因为我觉得用查询更改值更好,而不是使用foreach。
答案 0 :(得分:4)
见下面的代码:
var db = GetContext();
(from f in db.ProjectStateHistories
where f.ProjectId.Equals(oldProjectId)
select f)
.ToList()
.ForEach(i => i.ProjectId = newProjectId);
db.SaveChanges();
可替换地:
var db = GetContext();
db.ProjectStateHistories
.Where(f => f.ProjectId.Equals(oldProjectId))
.ToList()
.ForEach(f => f.ProjectId = newProjectId);
db.SaveChanges();
答案 1 :(得分:2)
我知道更换代码的最短路径是:
var db = getcontext();
db.ProjectStateHistories
.Where(f => f.ProjectId.Equals(oldProjectId))
.ToList()
.ForEach(f => f.ProjectId = newProjectId);
db.SaveChanges();
可以找到其他答案here
答案 2 :(得分:0)
我有一个可以帮助你的想法,我只是在这里免费编码!
如果您只是将每个作为选择的一部分,然后保存您的更改将有效吗?
foreach (var source in db.ProjectStateHistories.Where(x => x.ProjectId == oldProjectId))
{
source.ProjectId= newProjectId;
db.Entry(source).State = EntityState.Modified;
}
db.SaveChanges();
我认为这是一种更有效的方式。
.Select()方法只有在你需要Project to a view Model时才真正有用,它不会改变数据库中的变量,只是在新声明的对象中显示它们。
谢谢,
菲尔