Search code examples
c#.netnhibernatequeryover

QueryOver: Dynamically adding IsLike in Where clause


I've this QueryOver where I select Log records where the Logs Name starts with D or F (using wildcards).

conv.InnerTransaction.Session.QueryOver<Log>()
    .Where(l => l.DateTime > _datetime)
    .And(
        l => l.Name.IsLike("D%") || l.Name.IsLike("F%")
     )

Instead I would like the name searching to be dynamically using values from a list. How can this be done?

I've tried something like:

var query = conv.InnerTransaction.Session.QueryOver<Log>()
            .Where(l => l.DateTime > _datetime);
foreach (var name in _names)
{
    query = query.And(l => l.Name.IsLike(name));
}

But that would result in multiple AND statements for each name in the list, whereas It just need to be a OR.


Solution

  • Have you tried Disjunction? I had a similar requirement once, but I had to use Conjunction instead. Disjunction will or multiple conditions together.

    var disjunction = new Disjunction();
    var query = Session.QueryOver<Log>().Where(l => l.DateTime > _datetime);
    foreach (var name in _names)
    {
        disjunction.Add(Restrictions.On<Log>(log => log.Name).IsLike(name));
    }
    var queryResult = query.Where(disjunction).List<Log>();