使用Linq根据匹配值从另一个列表更新列表

3

当我从另一个来源查询上下文时,我希望更新列表中的值。

我可以通过两种不同的查询方式找到匹配项。

var r = from aa in context.Persons.GetItems()
        join bb in findPersonViewModel.findPersonResultsViewModel on aa.PersonId equals bb.PersonID
        select aa;

或者

var results = context.Persons.GetItems().Where(ax => findPersonViewModel.findPersonResultsViewModel.Any(b => ax.PersonId == b.PersonID));

为了简洁起见,我缩短了模型。
public class FindPersonResultsViewModel
{
    public int PersonID { get; set; }
    public bool ExistInContactManager { get; set; }
    public bool ActionType { get; set; }
}

public class PersonViewModel
{
     public int PersonID { get; set; }
}

目标: 如果PersonID匹配,那么更新FindPersonResultsViewModel,使ExistinContactManager和ActionType都为True

下面是一个可视化数据的示例:

var findPersonResultsViewModel = new List<FindPersonResultsViewModel>()
    { new FindPersonResultsViewModel { PersonID = 2, ActionType = false, ExistInContactManager = false },
      new FindPersonResultsViewModel { PersonID = 3, ActionType = false, ExistInContactManager = false },
      new FindPersonResultsViewModel { PersonID = 4, ActionType = false, ExistInContactManager = false },
      new FindPersonResultsViewModel { PersonID = 5, ActionType = false, ExistInContactManager = false },
      new FindPersonResultsViewModel { PersonID = 6, ActionType = false, ExistInContactManager = false },
    };



var personModel = new List<PersonViewModel>()
    { new PersonViewModel { PersonID = 2 },
      new PersonViewModel { PersonID = 6 },
      new PersonViewModel { PersonID = 8 },
      new PersonViewModel { PersonID = 9 },
      new PersonViewModel { PersonID = 12 },
      new PersonViewModel { PersonID = 22 },
      new PersonViewModel { PersonID = 32 },
      new PersonViewModel { PersonID = 42 },
    };

3
投上一票支持所包含的数据、课程和努力。 - TheGeneral
@RufusL 是的,不过我已经插入了。明白了。如果现在我想要更新记录,本质上我有两个列表,我找到了这些记录,如何更新呢?需要使用某种类型的循环吗?例如? - user10189172
@RufusL,这不是取决于使用吗?有什么阻止我继续管道查找匹配项并Select(映射)和保存更改的流程吗? - ChiefTwoPencils
@ChiefTwoPencils 这正是我所想的... - user10189172
@RufusL,实际上,这并不能用于变异。这是一个终端函数,意味着它不返回任何内容,因此除非你要变异的东西存在于管道之外,否则你将一无所获。但是,是的,这是作弊和不好的做法! - ChiefTwoPencils
显示剩余6条评论
1个回答

0
如果我理解你的问题...你可以使用Containsforeach
var ids = personModel.Select(x => x.PersonID);

var results = findPersonResultsViewModel.Where(x => ids.Contains(x.PersonID));

foreach (var item in results)
{
   item.ActionType = true;       
   item.ExistInContactManager = true
}

db.SaveChanges();

或者你可以通过使用 Join,并使用 foreach 进行更新,从而避免往返。

var results =
   from pr in findPersonResultsViewModel
   join p in personModel on pr.PersonID equals p.PersonID
   select pr;

foreach (var item in results)
{
   item.ActionType = true;
   item.ExistInContactManager = true;
}

db.SaveChanges();

输出

PersonID : 2, ActionType :True, ExistInContactManager :True
PersonID : 3, ActionType :False, ExistInContactManager :False
PersonID : 4, ActionType :False, ExistInContactManager :False
PersonID : 5, ActionType :False, ExistInContactManager :False
PersonID : 6, ActionType :True, ExistInContactManager :True

完整演示请点此


我现在唯一的问题是,我原本希望仍然使用的模型来显示在UI网格上(所有数据都在findPersonResultsViewModel中),现在有了一个单独的、隔离的结果。你不会知道这一点,因为我没有谈论过它...在这种情况下,我没有执行SaveChanges。你有什么想法吗? - user10189172
@ChadJacobs 这两个列表都在内存中吗? - TheGeneral
那么,我应该在 foreach 中更新 findPersonViewModel.findPersonResultsViewModel 吗? - user10189172
不,context.Persons.GetItems()不在内存中。 - user10189172
@ChadJacobs 嗯,基本上你可能想使用第一个(如果我理解你的意思),加载Persons.GetItems(),获取ids,在FindPersonResultsViewModels列表中执行Contains,然后使用foreach进行更新。 - TheGeneral
顺便说一句,工作得非常好。 - user10189172

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接