C# PredicateBuilder确实返回所有结果,并且可以';我找不到罪犯

C# PredicateBuilder确实返回所有结果,并且可以';我找不到罪犯,c#,linq-to-objects,predicatebuilder,C#,Linq To Objects,Predicatebuilder,我正在尝试实现PredicateBuilder,并创建了一个简单的测试。 我目前正在使用PredicateBuilderDelegate,因为我正在测试一个列表 问题是,当我运行测试时,我没有“过滤”记录和集合包含相同的元素,我不明白为什么会发生这种情况 FakeEntity类: public class FakeEntity { public int Id { get; set; } public string Name { get; set; } public boo

我正在尝试实现PredicateBuilder,并创建了一个简单的测试。 我目前正在使用PredicateBuilderDelegate,因为我正在测试一个
列表

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

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 !!

    }
}
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);
    }
}
公共类FakeEntity{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共布尔被删除{get;set;}
公共静态函数NotDeleted(){
var predicate=PredicateBuilderDelegate.True();
谓词和(e=>!e.IsDeleted);
返回谓词;
}
}
测试:

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 !!

    }
}
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);
    }
}
[TestClass]
公共类谓词BuilderTest{
[测试方法]
公开无效测试(){
var collection=new List(){new FakeEntity{IsDeleted=true},new FakeEntity{IsDeleted=false};
var result=collection.Where(FakeEntity.NotDeleted()).ToList();
集合assert.AreNotEquivalent(集合,结果);//失败!
Assert.IsTrue(result.Count()==1);//失败!!
}
}
PredicateBuilderDelegate:

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 !!

    }
}
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);
    }
}
公共静态类PredicateBuilderDelegate{
public static Func True(){return f=>True;}
public static Func False(){return f=>False;}
公共静态函数或(此函数expr1,
Func expr2){
返回t=>expr1(t)| | expr2(t);
}
公共静态函数和(此函数expr1,
Func expr2){
返回t=>expr1(t)和&expr2(t);
}
}

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

!非常感谢。