我想替换下面代码中的 lambda 表达式
var idQuery = Query<ApiStatisticsAggregatedStats>.EQ(t => t.Api, id);
有一个函数。将鼠标悬停在它表示声明是
Func<ApiStatisticsAggregatedStats, string>
虽然下面的代码给出了一个错误,
Func<ApiStatisticsAggregatedStats, string> idFunc = x => x.Api
var idQuery = Query<ApiStatisticsAggregatedStats>.EQ(idFunc, id);
错误:
The best overloaded method match for
Query<ApiStatisticsAggregatedStats>.EQ<string>(Expression<Func<ApiStatisticsAggregatedStats, IEnumerable<string>>>, string)
has some invalid arguments.
那在哪里IEnumerable
来自?我做错了什么?
最佳答案
查询提供程序,如 mongoDB 查询提供程序,使用表达式树而不是委托(delegate)。这就是为什么您必须将变量声明为
Expression<Func<ApiStatisticsAggregatedStats, string>> idFunc = x => x.Api
您仍然可以将 lambda 表达式分配给 Expression<Func<...>>
变量,因为编译器可以将您的 lambda 转换为来自 Expression
的适当方法调用编译期间的类。
When a lambda expression is assigned to a variable of type
Expression<TDelegate>
, the compiler emits code to build an expression tree that represents the lambda expression.
但是,它仅适用于单行 lambda。
The C# and Visual Basic compilers can generate expression trees only from expression lambdas (or single-line lambdas). It cannot parse statement lambdas (or multi-line lambdas).
如果您尝试执行以下操作:
Expression<Func<ApiStatisticsAggregatedStats, string>> idFunc = x => { return x.Api };
(注意 {
和 }
)您会收到编译错误,提示编译器无法将多行 lambda 转换为表达式树。
机器人报价来自 Expression Trees (C# and Visual Basic) .
关于c# - 用 Func 替换 MongoDB 查询中的 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22640497/