C# 表达式<;Func<;-操作员'||';无法应用于类型为';lambda表达式';和';lambda表达式';

C# 表达式<;Func<;-操作员'||';无法应用于类型为';lambda表达式';和';lambda表达式';,c#,linq,lambda,C#,Linq,Lambda,如何构造包含或的LINQ WHERE子句 这是我的密码: public static IQueryable<EmployeeObject> QueryableSQL() { IQueryable<EmployeeObject> queryable = EmployeeRepository.GetAllEmployee(); } public static IList<EmployeeObject> QLike(Expression<Func&

如何构造包含或的LINQ WHERE子句

这是我的密码:

public static IQueryable<EmployeeObject> QueryableSQL()
{
    IQueryable<EmployeeObject> queryable = EmployeeRepository.GetAllEmployee(); 
}

public static IList<EmployeeObject> QLike(Expression<Func<EmployeeObject, bool>> func)
{
   return QueryableSQL().Where(func).ToList();
}
publicstaticiqueryable QueryableSQL()
{
IQueryable queryable=EmployeeRepository.GetAllEmployee();
}
公共静态IList QLike(表达式func)
{
返回QueryableSQL().Where(func.ToList();
}
这样称呼:

QLike(t => t.Title == "stack" || t => t.Title == "over" || t => t.Title == "flow" ); <<<ERROR
QLike(t=>t.Title==“stack”| | t=>t.Title==“over”| | t=>t.Title==“flow”);t、 标题==“流量”) 该方法需要一个lambda表达式,而不是多个表达式。您需要将
|
运算符应用于单个布尔运算,如下所示:

QLike(t => t.Title == "stack" || t.Title == "over" || t.Title == "flow" ); 
可以这样说:

QLike(t => t.Title == "stack" || t.Title == "over" || t.Title == "flow");
因为

t => t.Title == "stack" 
是一个函数

所以


是两个函数,并且在它们之间应用了运算符。这是错误的语法。

您应该将单个lambda传递给方法。Lambda表达式语法应如下所示:

lambda-parameters => lambda-expression-body
下面是正确的语法:

QLike(t => t.Title == "stack" || t.Title == "over" || t.Title == "flow" )
顺便说一句,如果您要为正在查找的标题使用集合,您可以简化表达式(取决于
IQueryable
提供程序是否可以将其翻译,例如,EF提供程序将此类表达式翻译为IN语句):


你为什么要在这里表达?在这种情况下,您只需要Func。原因是它将使LINQ提供程序能够分析谓词,并将其作为原始SQL查询的一部分。如果未过滤的结果集很大,这会产生巨大的差异。这可能是将一百万条记录读入内存或读取一条记录之间的区别。不管怎样,下面的答案都是正确的。“=>”必须正好位于要传递的表达式的第一部分。
lambda-parameters => lambda-expression-body
QLike(t => t.Title == "stack" || t.Title == "over" || t.Title == "flow" )
string[] titles = { "stack", "over", "flow" };
QLike(t => titles.Contains(t.Title));