use*_*245 3 c# lambda func mongodb
我想替换以下代码中的 lambda 表达式
var idQuery = Query<ApiStatisticsAggregatedStats>.EQ(t => t.Api, id);
Run Code Online (Sandbox Code Playgroud)
带有功能。将鼠标悬停在声明上,它说声明是
Func<ApiStatisticsAggregatedStats, string>
Run Code Online (Sandbox Code Playgroud)
但是下面的代码给出了一个错误,
Func<ApiStatisticsAggregatedStats, string> idFunc = x => x.Api
var idQuery = Query<ApiStatisticsAggregatedStats>.EQ(idFunc, id);
Run Code Online (Sandbox Code Playgroud)
错误:
最好的重载方法匹配
Query<ApiStatisticsAggregatedStats>.EQ<string>(Expression<Func<ApiStatisticsAggregatedStats, IEnumerable<string>>>, string)有一些无效的参数。
那是IEnumerable从哪里来的?我究竟做错了什么?
查询提供程序,如 mongoDB 查询提供程序,使用表达式树而不是委托。这就是为什么你必须将变量声明为
Expression<Func<ApiStatisticsAggregatedStats, string>> idFunc = x => x.Api
Run Code Online (Sandbox Code Playgroud)
您仍然可以将 lambda 表达式分配给Expression<Func<...>>变量,因为编译器可以Expression在编译期间将您的 lambda 转换为来自类的正确方法调用。
将 lambda 表达式分配给类型为 的变量时
Expression<TDelegate>,编译器会发出代码以构建表示 lambda 表达式的表达式树。
但是,它仅适用于单行 lambda。
C# 和 Visual Basic 编译器只能从表达式 lambda(或单行 lambda)生成表达式树。它无法解析语句 lambdas(或多行 lambdas)。
如果您尝试执行以下操作:
Expression<Func<ApiStatisticsAggregatedStats, string>> idFunc = x => { return x.Api };
Run Code Online (Sandbox Code Playgroud)
(注意{和})你会得到编译错误,说编译器无法将多行 lambda 转换为表达式树。
Bot 引用来自Expression Trees(C# 和 Visual Basic)。