2013-02-23 78 views
3

我想扩展我的方法中的表达式参数以添加我自己的过滤器。我试图做类似以下,但语法是错误的:如何在lambda表达式参数中扩展谓词

public static IList<MyPage> DoSomething<T>(Expression<Func<T, bool>> predicate) 
{ 
    return DataStore().GetPages().Where(p => p.PublishDate < DateTime.Now && predicate) 
} 

编译器抱怨在Visual Studio 2012是抱怨与此错误:

Error 29 Operator '&&' cannot be applied to operands of type ' bool ' and ' System.Linq.Expressions.Expression<System.Func<T,bool>> '

将延长谓语第一个会更好那么回馈如果回.Where(predicate)?你会怎么做?

+0

我想'GETPAGES()'返回'IQueryale ',对吧? – svick 2013-02-23 09:50:39

+0

是的,它确实返回IQueryable – TruMan1 2013-02-23 09:52:57

+0

对不起实际返回IList – TruMan1 2013-02-23 10:16:16

回答

4

Would extending the predicate first be better then feed if back as .Where(predicate)? How would you do that?

是的,正是这样,如果我明白你的建议是正确的。你可以链.Where()这样的:

public static IList<MyPage> DoSomething<T>(Expression<Func<T, bool>> predicate) 
{ 
    return DataStore().GetPages().Where(p => p.PublishDate < DateTime.Now).Where(predicate); 
} 
+0

是的,在这个特定的情况下(把AND谓词放在一起),这是最好的选择。 ORing需要类似'PredicateBuilder'的东西。 – svick 2013-02-23 09:56:06

+0

编译错误,当我尝试的是:'PagesFacade.Where(System.Func )'的最佳重载方法匹配有一些无效的参数。 – TruMan1 2013-02-23 09:57:31

+0

@svick为了完整性,可以使用'.Union()'进行ORing,但是当它被转换为SQL并且查询变得足够复杂时,它可能会比真正的OR差得多。 – hvd 2013-02-23 09:57:41

相关问题