egbrad
egbrad

Reputation: 2417

RavenDB - Optional where clause

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?

Upvotes: 9

Views: 990

Answers (1)

Jim Bolla
Jim Bolla

Reputation: 8295

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();

Upvotes: 11

Related Questions