I want to write a RavenDB query that filters by a value if it is available, but if that value is not available, I want it to return all objects. For example, in linq to objects, I can do something like this:
var matches = people.Where(x => x.LastName == userEntry || userEntry == string.Empty).ToList();
But the following will not work:
var matches = RavenSession.Query<Person>().Where(x => x.LastName == userEntry || userEntry == string.Empty).ToList();
Because userEntry
is not an indexed value, this throws an exception.
How can I accomplish this?
Based on your comment about multiple optional predicates, you should be able to do something like this:
var where = new List<Expression<Func<Person, bool>>>();
if (!string.IsNullOrWhitespace(lastName))
where.Add(p => p.LastName == lastName);
if (!string.IsNullOrWhitespace(firstName))
where.Add(p => p.FirstName == firstName);
// etc...
var query = session.Query<Person>();
foreach (var clause in where)
query = query.Where(clause);
var results = query.ToList();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With