PredicateBuilder确实返回所有结果,并且可以';我找不到罪魁祸首

本文关键字:罪魁祸首 找不到 返回 结果 PredicateBuilder | 更新日期: 2023-09-27 18:28:23

我正在尝试实现PredicateBuilder,并创建了一个简单的测试。我目前正在使用PredicateBuilderDelegate,因为我正在针对List 进行测试

问题是,当我运行测试时,我没有"筛选"包含相同元素的记录和集合,我不明白为什么会发生这种情况。

FakeEntity类:

public class FakeEntity {
    public int Id { get; set; }
    public string Name { get; set; }
    public bool IsDeleted { get; set; }
    public static Func<FakeEntity, bool> NotDeleted() {
        var predicate = PredicateBuilderDelegate.True<FakeEntity>();
        predicate.And(e => !e.IsDeleted);
        return predicate;
    }
}

测试:

[TestClass]
public class PredicateBuilderTest {
    [TestMethod]
    public void Test() {
        var collection = new List<FakeEntity>() { new FakeEntity { IsDeleted = true }, new FakeEntity { IsDeleted = false } };
        var result = collection.Where(FakeEntity.NotDeleted()).ToList();
        CollectionAssert.AreNotEquivalent(collection, result); // FAIL!
        Assert.IsTrue(result.Count() == 1); // FAIL !!
    }
}

PredicateBuilderDelegate:

public static class PredicateBuilderDelegate {
    public static Func<T, bool> True<T>() { return f => true; }
    public static Func<T, bool> False<T>() { return f => false; }
    public static Func<T, bool> Or<T>(this Func<T, bool> expr1,
                                       Func<T, bool> expr2) {
        return t => expr1(t) || expr2(t);
    }
    public static Func<T, bool> And<T>(this Func<T, bool> expr1,
                                       Func<T, bool> expr2) {
        return t => expr1(t) && expr2(t);
    }
}

PredicateBuilder确实返回所有结果,并且可以';我找不到罪魁祸首

And方法返回一个新谓词。它不会通过突变谓词来更改它。(委托毕竟是不可变的。)您忽略了方法的返回值。