我想替换以下代码中的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);
错误:
Query<ApiStatisticsAggregatedStats>.EQ<string>(Expression<Func<ApiStatisticsAggregatedStats, IEnumerable<string>>>, string)
的最佳重载方法匹配有一些无效的参数。
IEnumerable
来自哪里?我做错了什么?
答案 0 :(得分:4)
查询提供程序(如mongoDB查询提供程序)使用表达式树而不是委托。这就是你必须将变量声明为
的原因Expression<Func<ApiStatisticsAggregatedStats, string>> idFunc = x => x.Api
您仍然可以将lambda表达式赋给Expression<Func<...>>
变量,因为编译器可以在编译期间将lambda转换为Expression
类的正确方法调用。
当lambda表达式分配给类型为
Expression<TDelegate>
的变量时,编译器会发出代码来构建表示lambda表达式的表达式树。
但是,它仅适用于单行lambda。
C#和Visual Basic编译器只能从表达式lambdas(或单行lambdas)生成表达式树。它无法解析语句lambda(或多行lambdas)。
如果您尝试执行以下操作:
Expression<Func<ApiStatisticsAggregatedStats, string>> idFunc = x => { return x.Api };
(注意{
和}
)你得到编译错误,说编译器无法将多行lambda转换为表达式树。