Passing a ravendb request as Func <T, bool> does not work
I play with RavenDb and wonder if I am missing something obvious.
The fact is that if I pass the request as follows:
var name = "test"; posts = RavenSession.Query<Post>() .Where(x => x.Tags.Any(y => y == name)) .OrderByDescending(x => x.CreatedAt) .Take(5);
It works fine if I write the equivalent (IMO) using Func<T, bool>
, it does not crash, but the request is absent when the condition is:
var name = "test"; Func<Post, bool> selector = x => x.Tags.Any(y => y == name); posts = RavenSession.Query<Post>() .Where(x => selector(x)) .OrderByDescending(x => x.CreatedAt) .Take(5);
Profiler displays it like this:
request = start = 0 PAGESIZE = 5 no aggregation = None sort = -CreatedAt
Update: It works if I use an expression instead of Func, so I thought that maybe I remember something wrong about Func and Linq, so I wrote a simple test:
var range = Enumerable.Range(1, 50); Func<int, bool> selector = x => x == 42; var filtered = range.Where(x => selector(x));
So, now the only question is why the Raven Db query builder acts differently.
Try using Expression
instead:
Expression<Func<Post, bool>> selector = x => x.Tags.Any(y => y == name);
And change Where(x => selector(x))
to Where(selector)
.
Expression
required because RavenDb can build an expression tree from it, which allows it to translate logic into database queries. He cannot build an expression tree from Func<Post, bool>
, so he can either ignore it, or issue exeption, or whatever is specified by the creators of RavenDb.