2013-05-08 68 views
6

我想編寫一個方法來查詢表使用Ormlite 這裏的SqlExpressionVisitor空cheking參數一個方法ServiceStack Ormlite SqlExpressionVisitor空檢查是我的方法:在擴展

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

但對象未設置到一個對象的一個​​實例。當我調用ev.Where部分時引發NullReferenceException。

這裏有一個錯誤,或者我錯過了什麼嗎? 謝謝。

回答

5

實際上,你可以選擇方法內部建立的ExpressionVisitor像這樣:

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

我仍然得到這種方法的NullReferenceException。我添加了一個工作解決方案。 – 2013-12-18 17:06:09

3

我知道這個問題是7個月大,但我有一個類似的問題&這是來到了第一個問題,當我搜索。因爲大師道德公司並不適合我,所以我想添加我的工作解決方案。

最初,我嘗試了與mustafasturan的第一次嘗試大致相似的語法。我得到了和他一樣的NullReferenceException。大師道德的回答也沒有幫助...

我試圖建立一個執行LIKE搜索,而不是完全匹配的搜索功能。請求對象有多個標準可能或不可以爲null(爲了簡單起見,我們將使用具有2個標準的示例)。遵循大師道德的建議,我試過這個:

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

我還有一個NullReferenceException。看起來像& &和||運營商不在lambda表達式中使用短路評估。

我最後不得不去是這樣的:

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

它不覺得很優雅,但它是我能找到的唯一可行的事情。