2013-05-08 9 views
6

vorrei scrivere un metodo per interrogare tavolo con un metodo con parametri Cheking Nulla utilizzando SqlExpressionVisitor di Ormlite Ecco il mio metodo:ServiceStack Ormlite SqlExpressionVisitor null check in Dove estensione

public static List<UserChatsDTO> GetUserChats(int startRow, int rowCount, DateTime? startDate, DateTime? endDate, string operatorName, short? rating, string visitorName) 
     { 
      using (IDbConnection db = DbFactory.OpenDbConnection()) 
      { 
       SqlExpressionVisitor<UserChatsDTO> ev = OrmLiteConfig.DialectProvider.ExpressionVisitor<UserChatsDTO>(); 
       ev.Where(q => 
        (startDate.HasValue && q.Dated >= startDate) && 
        (endDate.HasValue && q.Dated <= endDate) && 
        (!string.IsNullOrEmpty(operatorName) && q.TakenByUser.Contains(operatorName)) && 
        (rating.HasValue && q.Rating == (short)rating) && 
        (!string.IsNullOrEmpty(visitorName) && q.VisitorName.Contains(visitorName))); 
       //ev.OrderBy(); 
       ev.Limit(startRow, rowCount); 
       return db.Select<UserChatsDTO>(ev); 
      } 
     } 

Ma riferimento non impostato a un'istanza di un oggetto. NullReferenceException viene generata quando chiamo ev.Where part.

C'è un bug qui o mi manca qualcosa? Grazie.

risposta

5

Si può effettivamente costruire l'ExpressionVisitor all'interno del metodo Select in questo modo:

var chats = db.Select<UserChatsDTO>(q => q 
    .Where(x => startDate.HasValue && x.Date >= startDate) 
    .Where(x => endDate.HasValue && x.Date <= endDate) 
    .Where(x => string.IsNullOrEmpty(operatorName) || x.TakeByUser.Contains(operatorName)) 
    .Where(x => rating.HasValue && x.Rating == (short)rating) 
    .Where(x => string.IsNullOrEmpty(visitorName) || x.VisitorName.Contains(visitorName) 
    .Limit(startRow, rowCount)); 
+0

Sto ancora ricevendo una NullReferenceException con questo approccio. Ho aggiunto una soluzione funzionante. –

3

So che questa domanda è di 7 mesi di età, ma ho avuto un problema simile & questa è stata la prima domanda che è venuto quando ho cercato. Volevo aggiungere la mia soluzione di lavoro poiché il Maestro Morale non ha funzionato per me.

Originariamente, ho provato la sintassi più o meno come il primo tentativo di mustafasturan. Ho avuto la stessa NullReferenceException che ha fatto. La risposta di Master Morality non ha aiutato neanche ...

Sto provando a creare una funzione di ricerca che esegua le ricerche LIKE piuttosto che una corrispondenza esatta. Esistono più criteri sull'oggetto richiesta che possono o non possono essere nulli (per semplicità utilizzeremo un esempio con 2 criteri). Seguendo il suggerimento del Maestro Morale, ho provato questo:

var searchResults = db.Select<Item>(q => q 
     .Where(x => string.IsNullOrWhiteSpace(request.Criteria1) || x.Criteria1.Contains(request.Criteria1)) 
     .Where(x => string.IsNullOrWhiteSpace(request.Criteria2) || x.Criteria2.Contains(request.Criteria2)) 
    ); 

Ho ancora una NullReferenceException. Sembra lo & & e || gli operatori non utilizzano la valutazione di cortocircuito all'interno dell'espressione lambda.

Che fine ho dovuto andare con è questo:

SqlExpressionVisitor<Item> ev = new ServiceStack.OrmLite.MySql.MySqlExpressionVisitor<Item>(); 

if (!String.IsNullOrWhiteSpace(request.Criteria1)) { 
    ev.Where(q => q.Criteria1.Contains(request.Criteria1)); 
} 
if (!String.IsNullOrWhiteSpace(request.Criteria2)) { 
    ev.Where(q => q.Criteria2.Contains(request.Criteria2)); 
} 

searchResults = db.Select<Item>(ev); 

Non si sente molto elegante, ma è l'unica cosa che sono riuscito a trovare che funziona.