【问题标题】:Update using Linq Query使用 Linq 查询更新
【发布时间】:2011-01-27 14:30:48
【问题描述】:

我有两个系列。一个有一个 ID(int) 和 IsIDValid(bool) 变量。和其他集合具有 ID(int)。如果 ID 存在于第二个集合中,我想将第一个集合的 IsIDValid 属性更新为 true。

编辑:感谢您的回答。我可以在不使用 foreach 循环的情况下以某种方式做到这一点吗?

【问题讨论】:

  • foreach:不,您总是必须至少遍历第一个集合一次。所有这些答案都只做一次。您希望避免什么?
  • 唯一可以避免的方法是 hack,在其中修改 LINQ 查询 lambdas 中的元素。好的风格是将集合视为不可变的,并在不使用 LINQ 的情况下修改结果。

标签: .net linq linq-to-entities


【解决方案1】:

简单:

var validIds = new HashSet<int>(other.Select(x => x.Id));
var query = firstCollection.Where(x => validIds.Contains(x.Id));
foreach (var item in query)
{
    item.IsIdValid = true;
}

【讨论】:

    【解决方案2】:

    这行得通:

    var valid = firstCollection.Where(f=> secondCollection.Any(s=> s.ID == f.ID));
    foreach (var v in valid) { v.IsValid = true; }
    

    【讨论】:

      【解决方案3】:

      This SO answer 有更多关于使用 linq 更新多行的信息。

      【讨论】:

        【解决方案4】:

        按照 Jon 的思路,您也可以使用 LINQ 的 Join

        var query = firstCollection.Join(other, fc => fc.Id, o => o.Id, (fc, o) => fc);
        foreach (var item in query)
        {
            item.IsIdValid = true;
        }
        

        这本质上是相同的,只是您让 LINQ 选择合并两个集合的策略,而不是自己显式构建一个 HashSet。我不知道哪个在幕后更有效,但我希望 Join 至少一样好。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-04
          • 2018-05-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多