2
有沒有辦法使用GetAllWithChildren()或GetAll()或GetAllWithChildrenAsync()或GetAllAsync()來限制/分頁結果集。有沒有限制/頁面結果集的方法
這些方法接受過濾表達式,但似乎沒有任何設置顯式限制器或orderby子句的直接方式。
有沒有辦法使用GetAllWithChildren()或GetAll()或GetAllWithChildrenAsync()或GetAllAsync()來限制/分頁結果集。有沒有限制/頁面結果集的方法
這些方法接受過濾表達式,但似乎沒有任何設置顯式限制器或orderby子句的直接方式。
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);
感謝您的迴應。爲其他人閱讀。 elements.Skip(offset.Value);應該是elements = elements.Skip(offset.Value); 否則跳過被忽略。與take相同。 – dss
更新的答案,很好的接收。 – redent84