2015-07-15 12 views
6

Stavo cercando di utilizzare i metodi Where and OrWhere di SqlBuilder per Dapper, ma non si comporta come mi aspetterei.Dapper SqlBuilder oWhere utilizzando AND anziché OR

La parte modificata di this question è in pratica ciò che ho eseguito. Dal momento che non ha ricevuto una risposta, lo chiederò qui.

var builder = new SqlBuilder(); 
var sql = builder.AddTemplate("select * from table /**where**/ "); 
builder.Where("a = @a", new { a = 1 }) 
     .OrWhere("b = @b", new { b = 2 }); 

mi aspettavo select * from table WHERE a = @a OR b = @b

ma ho avuto select * from table WHERE a = @a AND b = @b

Esiste un modo per aggiungere un OR per la clausola where utilizzando lo SqlBuilder?

Penso che sia solo questione di cambiare quanto segue nella classe SqlBuilder per dire OR invece di AND, ma volevo confermare.

public SqlBuilder OrWhere(string sql, dynamic parameters = null) 
{ 
    AddClause("where", sql, parameters, " AND ", prefix: "WHERE ", postfix: "\n", IsInclusive: true); 
    return this; 
} 

risposta

5

Nevermind. Ho guardato attraverso il codice SqlBuilder e ha scoperto che, se non v'è una miscela di Dove e OrWhere, si farà il seguente:

  • unire tutte le clausole AND
  • unire tutte le clausole OR separatamente
  • Fissare il Clausole OR alla fine delle clausole AND con un AND

Se non si dispone di più di 1 OrWhere, non verrà visualizzato alcun OR.

io modifico la mia logica query per tener conto di questo

+0

Così come la soluzione sguardo? Mi sono imbattuto anche in questo problema e dopo aver guardato attraverso il codice sorgente di SqlBuilder mi chiedo se l'annidamento di OR e AND funziona in qualche modo in sqlbuilder: (... OR ...) AND (... OR ...) vs. (... AND ...) O (... AND ...) – aurora

+1

Da quello che ricordo, sembra funzionare in questo modo. (... E ... E ... E (... O ... O ... O)). Metterà tutti gli AND insieme e quindi metterà le OR alla fine nel proprio gruppo – Fama

0

Bisogna modificare la tua ricerca in:

var builder = new SqlBuilder(); 
var sql = builder.AddTemplate("select * from table /**where**/ "); 
builder.OrWhere("a = @a", new { a = 1 }) 
     .OrWhere("b = @b", new { b = 2 });