【问题标题】:Update List from another List with Matching values using Linq使用 Linq 从另一个具有匹配值的列表更新列表
【发布时间】:2019-10-27 12:59:14
【问题描述】:

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

我可以通过 2 种不同风格的查询找到匹配项

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 以将 ExistinContactManagerActionType 都设为 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 },
    };

【问题讨论】:

  • 为所包含的数据、课程和努力点赞
  • Linq 用于查询(过滤、加入等,最终目标是选择某些内容),而不是更新
  • @RufusL 是的,但是我已经插入了。明白了。如果我现在想更新记录并且基本上我有 2 个列表,我找到了记录,我该如何更新?某种类型的循环?例子?
  • @RufusL,这不取决于使用吗?是什么阻止我继续查找匹配项和Select(地图)并保存更改的管道?
  • @ChiefTwoPencils 这就是我的想法……

标签: c# .net list linq collections


【解决方案1】:

如果我明白你在问什么...你可以使用 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

Full Demo here

【讨论】:

  • 我现在唯一的麻烦是我希望仍然使用我的原始模型在 UI 网格上显示(findPersonResultsViewModel 中的所有数据),现在我有一个单独的结果是孤立的。你不会知道这一点,因为我没有谈论它......在这种情况下我没有做 SaveChanges。想法?
  • @ChadJacobs 都是内存中的列表?
  • 那么基本上我应该在 foreach 中更新 findPersonViewModel.findPersonResultsViewModel 吗?
  • 不,context.Persons.GetItems() 不在内存中
  • @ChadJacobs 是的,所以基本上你可能想使用第一个(如果我理解你的话)加载 Persons.GetItems(),获取 ID,在 FindPersonResultsViewModels 列表上执行包含然后更新有一个 foreach。
猜你喜欢
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 2020-06-23
  • 2021-10-16
相关资源
最近更新 更多