2013-05-08 11 views
6

Ich mag würde, ein Verfahren schreiben für die Abfrage-Tabelle mit einer Methode von null cheking Parametern SqlExpressionVisitor von Ormlite Hier ist meine Methode:ServiceStack Ormlite SqlExpressionVisitor NULL-Prüfung in Wo Erweiterung

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); 
      } 
     } 

Aber Objektverweis wurde nicht gesetzt zu einer Instanz eines Objekts. NullReferenceException wird ausgelöst, wenn ich ev.Wort aufrufen.

Gibt es hier einen Fehler oder fehlt mir etwas? Danke.

Antwort

5

Sie können tatsächlich die Expression innerhalb der Select-Methode wie so aufbauen:

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

Ich bekomme immer noch eine NullReferenceException mit diesem Ansatz. Ich habe eine funktionierende Lösung hinzugefügt. –

3

Ich weiß, diese Frage 7 Monate alt ist, aber ich hatte ein ähnliches Problem & dies war die erste Frage, die nach oben kam, als ich gesucht. Ich wollte meine Arbeitslösung hinzufügen, da Master Morality für mich nicht funktionierte.

Ursprünglich habe ich versucht Syntax ähnlich wie Mustafasturan ersten Versuch. Ich habe dieselbe NullReferenceException wie er. Die Antwort von Master Morality hat auch nicht geholfen ...

Ich versuche eine Suchfunktion zu erstellen, die LIKE-Suchen durchführt und nicht genau übereinstimmt. Es gibt mehrere Kriterien für das Anfrageobjekt, die null sein können oder nicht (der Einfachheit halber verwenden wir ein Beispiel mit zwei Kriterien). Nach Vorschlag des Meisters Morality, habe ich versucht, dies:

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)) 
    ); 

Ich habe immer noch eine Nullreferenceexception. Scheint wie die & & und || Operatoren verwenden keine Kurzschlußauswertung innerhalb des Lambda-Ausdrucks.

Was ich gehen musste schließlich mit, ist dies:

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); 

Es ist nicht sehr elegant fühlt, aber es ist das einzige, was ich finden konnte, das funktioniert.