Search code examples
nhibernatenhibernate-criteriaqueryover

nHibernate: Conjunctions and Disjunctions using QueryOver


Let's say I have a SQL query I need to render using nHibernate. The SQL query's WHERE clause consists of three OR statements, each of which contains a list of conditions. For example:

SELECT * 
FROM MyTable 
WHERE
    (OrderId = 1 and ItemId = 100) 
    OR
    (OrderId = 2 and ItemId = 200)
    OR
    (OrderId = 3 and ItemId = 300)

Using nHibernate's Criteria syntax, I could use a disjunction to implement this:

var disjunction = Restrictions.Disjunction();

foreach (var tuple in OrdersAndLineItems)
{
    var conjunction = Restrictions.Conjunction();
    var order = tuple.Item1;
    var lineitem = tuple.Item2;

    conjunction.Add(Restrictions.Eq("OrderId", order.Id));
    conjunction.Add(Restrictions.Eq("LineItemId", lineitem.Id));

    disjunction.Add(conjunction);
}

var result = Session.CreateCriteria<SomeClass>().Add(disjunction).ToList();

How would I write the same type of query using the QueryOver syntax in nHibernate 3.x?


Solution

  • Never mind -- I stumbled across an earlier StackOverflow post that provided the answer I was looking for, shortly after I posted. Here's my original example rewritten using QueryOver syntax:

    var disjunction = Restrictions.Disjunction();
    
    foreach (var tuple in OrdersAndLineItems)
    {
        var conjunction = Restrictions.Conjunction();
        var order = tuple.Item1;
        var lineitem = tuple.Item2;
    
        conjunction.Add(Restrictions.On<SomeClass>(x => x.OrderId).Equals(order.Id));
        conjunction.Add(Restrictions.On<SomeClass>(x => x.LineItemId).Equals(lineitem.Id));
    
        disjunction.Add(conjunction);
    }
    
    var result = Session.CreateCriteria<SomeClass>().Add(disjunction).ToList();