Compiled C# Linq expression and querying Mongo

I've inherited some code from a former employee that queries a mongo DB using compiled Linq expressions and the MongoRepository library (which sits on top of the MongoDB C# driver).

These were taking a long time to run - usually around 6 minutes(!) and causing problems with controller methods that used them.

So I've simplified the code and removed the call to .Compile() the lambda expression and this has seemed to solve the issue (takes <10s to run now).

My questions is: why does compiling this expression cause problems when querying mongo?

This was the gist of the original code (hacked out, so out of context sorry):

public class BaseMongoRepository<T> : MongoRepository<T, Guid> where T : IEntity<Guid> {
protected BaseMongoRepository(string connectionString) : base(connectionString) { }

protected bool IsSatisfiedBy(T entity) {
    Expression&lt;Func&lt;T, bool&gt;&gt; func = x =&gt; x != null &amp;&amp; x.ToString() == "foo"; // query was passed in, but you get the idea
    var predicate = func.Compile(); // THIS LINE??
    return predicate(entity);
}

public IEnumerable&lt;T&gt; Find() {
    return base.collection.AsQueryable().Where(IsSatisfiedBy);
}

}

And I simplified it to something that just uses a regular predicate Func:

public IEnumerable<T> Find() {
return base.collection.AsQueryable().Where(x => x != null && x.ToString() == “foo”);
}

Any thoughts most appreciated!

#c-sharp #linq #mongodb

7 Likes38.60 GEEK