【发布时间】:2019-01-25 22:28:01
【问题描述】:
我从一位前雇员那里继承了一些代码,该代码使用已编译的 Linq 表达式和 MongoRepository library(位于 MongoDB C# 驱动程序之上)查询 mongo DB。
这些需要很长时间才能运行 - 通常大约 6 分钟(!)并导致使用它们的控制器方法出现问题。
所以我简化了代码并删除了对.Compile() lambda 表达式的调用,这似乎解决了问题(现在运行需要
我的问题是:为什么在查询 mongo 时编译这个表达式会导致问题?
这是原始代码的要点(被黑了,所以断章取义):
public class BaseMongoRepository<T> : MongoRepository<T, Guid> where T : IEntity<Guid> {
protected BaseMongoRepository(string connectionString) : base(connectionString) { }
protected bool IsSatisfiedBy(T entity) {
Expression<Func<T, bool>> func = x => x != null && x.ToString() == "foo"; // query was passed in, but you get the idea
var predicate = func.Compile(); // THIS LINE??
return predicate(entity);
}
public IEnumerable<T> Find() {
return base.collection.AsQueryable().Where(IsSatisfiedBy);
}
}
我将其简化为只使用常规谓词Func:
public IEnumerable<T> Find() {
return base.collection.AsQueryable().Where(x => x != null && x.ToString() == "foo");
}
最感谢的任何想法!
【问题讨论】:
-
如果集合有 1,000,000 个实体,并且对于每个实体,它必须将表达式编译 成委托。这是一个相对耗时的操作,如果重复 1,000,000 次,执行这样的查询可能需要很长时间。将 Func 保存在字段或某些情况下的字典中会更合乎逻辑
标签: c# mongodb linq lambda mongorepository