2011-10-15 56 views
1

我想将lambda函数的多重选择合并到lambda表达式中。我怎么做?我知道最后一行是错误的,但是让你明白我的意思。将Lambda函数转换为Lambda表达式

Func<Event, bool> where = null; 

if (!string.IsNullOrWhiteSpace(searchToken)) 
    where = q => q.Name.ToUpper().Contains(searchToken.ToUpper()); 

where += q => q.Hidden = false; 

Expression<Func<Event, bool>> where1 = q => where; <-- Erroring 
+1

目前尚不清楚你的目标是什么。你是否想要执行多个过滤器?什么是更大的图片? –

+0

更大的图片是我有一个通用函数,需要表达式>。我有条件声明,我需要添加或不。我正在使用Func 来构建我的标准,但希望将它作为表达式>发送到泛型函数。 –

+0

我注意到了一种叫做表达式生成器的东西,但是有没有一种默认的方式来做到这一点? –

回答

4

我怀疑你想要PredicateBuilder。 (源是可用的页面上。)你会使用这样的:

var predicate = q => !q.Hidden; 
if (!string.IsNullOrWhiteSpace(searchToken)) 
{ 
    predicate = predicate.And(q => q.Name.ToUpper() 
             .Contains(searchToken.ToUpper()); 
} 
return predicate; 

这是假设你想“和”的条件 - 你从来没有说的很清楚......

注意那就是而不是这是一种以不区分大小写的方式进行比较的好方法。如果您可以告诉我们将使用哪些查询(例如LINQ to SQL,LINQ to EF),我们可以建议执行不区分大小写的查询的供应商兼容方式。

+0

什么是var predicate = q =>!q.Hidden;?这是Func的表达吗? –

+0

@MikeFlynn:那不会编译 - 你不能使用将lambda表达式分配给隐式类型变量。你可以有'Expression > predicate = q =>!q.Hidden;'或'Func predicate = q =>!q.Hidden;'。第一个会给你一个表达树,后者是一个代表。 –

0

看看http://msdn.microsoft.com/en-us/library/bb882637.aspx。如何使用表达式树来构建动态查询。当使用表达式<>就像在表达式必须在编译时已知的一样,因为编译器然后编译AST抽象语法三并将它作为数据存储在您的表达式<>实例中。