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

标签 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);

错误:

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/

相关文章:

python - 检查并删除 python MongoDB 中的重复项

c# - 异步运行同步代码

c# - 如何在 C# 中模拟 "friend"?

java - 查找所有 UUID MongoRepository

c# - 您如何使用 Fluent Validation 对列表中的每个字符串进行验证?

javascript - 用于在集合中获取子项和孙子项的 Mongoose 查询

java - 从对象列表到基于 Java 8 或 Guava 的键和值对对象进行分组

包含的 Java 8 过滤器

c# - F# 编码风格 - 静态方法与实例方法

c# - 使用 .NET 的单个命令将 SQL INSERT 和 SELECT 插入 Oracle