2015-12-21 51 views
2

有沒有辦法使用GetAllWithChildren()或GetAll()或GetAllWithChildrenAsync()或GetAllAsync()來限制/分頁結果集。有沒有限制/頁面結果集的方法

這些方法接受過濾表達式,但似乎沒有任何設置顯式限制器或orderby子句的直接方式。

回答

3

GetAllWithChildren方法只是一種方便的方法。要執行自定義查詢,您必須使用Table方法。它不應該是很難實現與要擴展功能,你自己取的方法已經存在GetAllWithChildren

public static class OrderExtensions { 
    public static List<T> GetAllWithChildren<T>(this SQLiteConnection conn, 
      Expression<Func<T, bool>> filter = null, 
      Expression<Func<T, object>> orderExpr = null, 
      int? limit = null, 
      int? offset = null, 
      bool recursive = false) where T: class 
    { 
     var elements = conn.Table<T>(); 
     if (filter != null) { 
      elements = elements.Where(filter); 
     } 
     if (orderExpr != null) { 
      elements = elements.OrderBy(orderExpr); 
     } 
     if (offset != null) { 
      elements = elements.Skip(offset.Value); 
     } 
     if (limit != null) { 
      elements = elements.Take(limit.Value); 
     } 

     var list = elements.ToList(); 

     foreach (T element in list) 
     { 
      conn.GetChildren(element, recursive); 
     } 

     return list; 
    } 
} 

然後你可以使用它像這樣:

conn.GetAllWithChildren<MyClass>(
      filter: o => o.Name != "", 
      orderBy: o => o.Name, 
      limit: 10, offset: 20); 

或更簡潔(和較少描述性)版本:

conn.GetAllWithChildren<MyClass>(o => o.Name != "", o => o.Name, 10, 20); 
+0

感謝您的迴應。爲其他人閱讀。 elements.Skip(offset.Value);應該是elements = elements.Skip(offset.Value); 否則跳過被忽略。與take相同。 – dss

+0

更新的答案,很好的接收。 – redent84