3

How can PredicateBuilder be used to OR together several statements with nested AND's, without stripping brackets?

We are trying to get:

(fieldA = X AND fieldB = Y AND fieldC = Z)  or (fieldA = A AND fieldB = B and fieldC = C)

But the code below generates (note no brackets, meaning DB query returns wrong data)

fieldA = X AND fieldB = Y AND fieldC = Z  or fieldA = A AND fieldB = B and fieldC = C

We are building the predicate like this:

var predicate = PredicateBuilder.False<MonitoredService>();

foreach (var a in affected)
{
    var a1 = a;
    predicate = predicate.Or(m => m.ItemId == a1.ItemId && m.MinSeverity <= a1.Severity && m.LastUpdatedUtc <= a1.LastModifiedUtc);
}

var monitors = _monitoredServiceRepository.List(predicate);
geoffreys
  • 1,107
  • 7
  • 24

1 Answers1

1

In LINQ and SQL Server (and i'm positive that this is also the case for MySQL, Oracle and other DBs), AND operators are evaluated first before OR operator.

So

(fieldA = X AND fieldB = Y AND fieldC = Z)  or (fieldA = A AND fieldB = B and fieldC = C)

Is same as

fieldA = X AND fieldB = Y AND fieldC = Z  or fieldA = A AND fieldB = B and fieldC = C
LostInComputer
  • 15,188
  • 4
  • 41
  • 49