Если вы не предоставляете IQueryable
непосредственно для пользовательского интерфейса (вероятно, нет, потому что вы используете бизнес-уровень между пользовательским интерфейсом и уровнем доступа к данным), вы можете использовать пользовательский объект, передавая «список информации».Это может выглядеть следующим образом:
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; }
}
Это будет использоваться в качестве параметра вашего бизнес-метода, возвращающего данные, а внутри бизнес-метода вы будете использовать пользовательские расширения для работы с IQueryable
, предоставленными EF или репозиторием:
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);