Я унаследовал некоторый код от бывшего сотрудника, который запрашивает базу данных mongo, используя скомпилированные выражения Linq и библиотеку MongoRepository (которая находится поверх драйвера MongoDB C #).
Это заняло много времени - обычно около 6 минут (!) И вызывало проблемы с методами контроллера, которые их использовали.
Итак, я упростил код и удалил вызов .Compile()
лямбда-выражения, и это, похоже, решило проблему (теперь требуется <10 секунд). </p>
Мои вопросы: почему компиляция этого выражения вызывает проблемы при обращении к монго?
Это было суть исходного кода (взломан, так что из контекста извините):
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");
}
Любые мысли больше всего ценятся!