如果您不直接向用戶界面公開IQueryable
(可能不是因爲您在UI和數據訪問層之間使用業務層),那麼您可以使用自定義對象傳遞「列表信息」。它可以是這樣的:
public class ListOptions<T>
{
// Paging
public int Page { get; set; }
public int PageSize { get; set; }
// Sorting
public IList<SortOptions<T>> SortOptions { get; set; }
}
public class SortOptions<T>
{
public Expression<Func<T, object>> SortProperty { get; set; }
public bool IsDescending { get; set; }
}
您將使用它作爲您的業務方法返回的數據和業務方法裏面,你會使用自定義擴展與EF或倉庫提供IQueryable
工作的參數:
public static class QueryableExtensions
{
public static IQueryable<T> ApplyListOptions<T>(this IQueryable<T> query, ListOptions<T> options)
{
if (options != null && options.SortOptions.Count > 0)
{
IOrderedQueryable<T> orderedQuery = query.ApplyOrderBy(options.SortOptions[0]);
for (int i = 1; i < options.SortOptions.Count; i++)
{
orderedQuery = orderedQuery.ApplyThenBy(options.SortOptions[i]);
}
query = orderedQuery.ApplyPaging(options.Page, options.PageSize);
}
return query;
}
public static IOrderedQueryable<T> ApplyOrderBy<T>(this IQueryable<T> query, SortOptions<T> sortOption)
{
if (sortOption.IsDescending)
{
return query.OrderByDescending(sortOption.SortProperty);
}
return query.OrderBy(sortOption.SortProperty);
}
public static IOrderedQueryable<T> ApplyThenBy<T>(this IOrderedQueryable<T> query, SortOptions<T> sortOption)
{
if (sortOption.IsDescending)
{
return query.ThenByDescending(sortOption.SortProperty);
}
return query.ThenBy(sortOption.SortProperty);
}
public static IQueryable<T> ApplyPaging<T>(this IOrderedQueryable<T> query, int page, int pageSize)
{
if (pageSize > 0)
{
return query.Skip((page - 1)*pageSize).Take(pageSize);
}
return query;
}
}
所以,你的處理方法可以看起來像:
public IEnumerable<User> GetUsers(ListOptions<User> listOptions)
{
return _context.Users.ApplyListOptioins(listOptions).AsEnumerable();
}
而且你會調用該方法,如:
var options = new ListOptions<User>
{
Page = 2,
PageSize = 3,
SortOptions = new List<SortOptions<User>>
{
new SortOptions<User>
{
IsDescending = false,
SortProperty = u => u.LastName
},
new SortOptions<User>
{
IsDescending = true,
SortProperty = u => u.FirstName
}
}
};
var data = usersService.GetUsers(options);
最簡單的方法是使用* Dynamic Linq * - 如果你搜索這些條款,你會發現很多例子。還可以查看http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx – BrokenGlass 2011-03-20 16:11:51