Linq用另一个值替换列值

时间:2016-05-06 14:36:34

标签: 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();

我搜索了一些答案,我发现我可以使用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。

3 个答案:

答案 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时才真正有用,它不会改变数据库中的变量,只是在新声明的对象中显示它们。

谢谢,

菲尔