用Func替换MongoDB查询中的lambda表达式

时间:2014-03-25 16:21:38

标签: c# mongodb lambda func

我想替换以下代码中的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来自哪里?我做错了什么?

1 个答案:

答案 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转换为表达式树。

Bot引用来自Expression Trees (C# and Visual Basic)