Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PredicateBuilder stripping brackets, breaking nested AND's combined with OR

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);
like image 349
geoffreys Avatar asked Feb 03 '26 21:02

geoffreys


1 Answers

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
like image 190
LostInComputer Avatar answered Feb 05 '26 10:02

LostInComputer