小编Cat*_*Cat的帖子

为什么IEnumerable.Where方法允许可以更改数据的谓词?

我正在寻找解释为什么允许编译以下代码行的原因:

var results = someCollection.Where(x => x.SomeBooleanProperty = true);
Run Code Online (Sandbox Code Playgroud)

注意使用单个相等运算符(可能是开发人员处于SQL模式),这是一个非常容易犯的错误.这会编译并在评估结果时(例如someCollection.ToList())将整个集合中的标志更改为true !!

如果您正在使用实体框架或任何其他ORM,那么这可以被检测为更改.我刚刚在生产代码中遇到过这个问题,但幸运的是,它只在一个只读屏幕上引起了一个小问题(但完全是竹子问题).想象一下,如果数据实际上是持久的,可能由此引起的可怕的逻辑和数据问题.

只是为了确保我没有发疯,它确实改变了数据,我写了一个失败的测试:

[Test]
public void Test_because_im_scared()
{
    var falseProperty = new TestModel {BooleanProperty = false};
    var trueProperty = new TestModel {BooleanProperty = true};

    var list = new List<TestModel>{falseProperty, trueProperty};

    var results = list.Where(x => x.BooleanProperty = true);

    Assert.IsFalse(falseProperty.BooleanProperty);
    Assert.IsTrue(trueProperty.BooleanProperty);

    //all fine so far, now evaluate the results
    var evaluatedResults = results.ToList();

    Assert.IsFalse(falseProperty.BooleanProperty);  //test fails here!
    Assert.IsTrue(trueProperty.BooleanProperty);
}
Run Code Online (Sandbox Code Playgroud)

c# linq

3
推荐指数
1
解决办法
410
查看次数

标签 统计

c# ×1

linq ×1