Linq to objects Predicate Builder

使用linq到对象(不是linq到sql)进行条件查询的最佳方法是什么。

目前我正在使用http://www.albahari.com/nutshell/predicatebuilder.aspx中的Predicate构建器,并将已编译的谓词传递给IEnumerable.Where,它看起来效果很好。

我要解决的示例代码:

我有这个

string keyword1 = "Test1"; string keyword2 = "Test3"; IEnumerable tests = new List() { new TestObject() {Name1 = "Test1", Name2 = "Test1"}, new TestObject() {Name1 = "Test2", Name2 = "Test2"}, new TestObject() {Name1 = "Test3", Name2 = "Test3"}, }; if (!String.IsNullOrEmpty(keyword1) && String.IsNullOrEmpty(keyword2)) tests = tests.Where(e => e.Name1.Contains(keyword1)); else if (!String.IsNullOrEmpty(keyword2) && !String.IsNullOrEmpty(keyword1)) tests = tests.Where(e => e.Name2.Contains(keyword2) || e.Name1.Contains(keyword1)); return tests.ToList(); 

只需将PredicateBuilder更改为使用委托而不是表达式树,并使用lambdas构建结果:

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