C# 将Lambda函数转换为Lambda表达式

C# 将Lambda函数转换为Lambda表达式,c#,linq,lambda,C#,Linq,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;

我正在尝试将多重选择与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
Func其中=null;
如果(!string.IsNullOrWhiteSpace(searchToken))
其中=q=>q.Name.ToUpper().Contains(searchToken.ToUpper());
其中+=q=>q.Hidden=false;
表达式,其中1=q=>其中 看。如何使用表达式树构建动态查询

这样使用表达式时,该表达式必须在编译时已知,因为编译器随后构建AST抽象语法3并将其作为数据存储在表达式实例中。

请查看。如何使用表达式树构建动态查询

在使用这样的表达式时,该表达式必须在编译时已知,因为编译器随后构建AST抽象语法3,并将其作为数据存储在表达式实例中。

我想您需要这样做。(该页面上提供了源代码。)您可以这样使用它:

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),我们可以建议一种与提供程序兼容的方式来执行不区分大小写的查询。

我猜您希望这样做。(该页面上提供了源代码。)您可以这样使用它:

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),我们可以建议一种与提供程序兼容的方式来执行不区分大小写的查询。

不清楚您真正的目的是什么。您正在尝试执行多个筛选器吗?更大的图景是什么?更大的图景是我有一个接受表达式的通用函数。我需要添加或不添加条件语句。我正在使用Func生成我的条件,但希望将其作为表达式发送到泛型函数。我注意到一个名为Expression Builder的东西,但有默认方法吗?您可以从委托生成
表达式
,但它几乎肯定不会满足您的需要。请注意,即使在LINQ to对象中,构建这样的多播委托也几乎肯定不会满足您的要求-只会使用上一个条件的返回值。不清楚您真正的目的是什么。您正在尝试执行多个筛选器吗?更大的图景是什么?更大的图景是我有一个接受表达式的通用函数。我需要添加或不添加条件语句。我正在使用Func生成我的条件,但希望将其作为表达式发送到泛型函数。我注意到一个名为Expression Builder的东西,但有默认方法吗?您可以从委托生成
表达式
,但它几乎肯定不能满足您的需要。请注意,即使在LINQ to对象中,构建这样的多播委托也几乎肯定不能满足您的要求-只会使用上一个条件的返回值。什么是var predicate=q=>!q、 隐藏的;?这是Func的表达式吗?@MikeFlynn:这不会编译-不能使用将lambda表达式赋值给隐式类型的变量。您可以使用
表达式谓词=q=>!q、 隐藏的
Func谓词=q=>!q、 隐藏的。第一个将为您提供一个表达式树,后一个为委托!q、 隐藏的;?这是Func的表达式吗?@MikeFlynn:这不会编译-不能使用将lambda表达式赋值给隐式类型的变量。您可以使用
表达式谓词=q=>!q、 隐藏的
Func谓词=q=>!q、 隐藏的。第一个将为您提供一个表达式树,后一个为委托。