Я изучаю C#
из Java
, я знаю, что на этой платформе есть ряд таких вопросов, я их проверял, но ни один из них не объясняет мою проблему. Мне нравится тот факт, что C#
и Java
имеют много общего, это делает мой переход намного более быстрым и плавным, что говорит о том, что я создаю API
, который вернет paginated result
, разбивка на страницы работает отлично, проблема возникла, когда я попытался ввести объект ответа Single
, который мой API
будет возвращать независимо от конечной точки, мой класс ответа выглядит так:
public class PaginatedResponse<T>
{
public PaginatedList<T> PaginatedList;
public int Page { get; set; }
public int PageSize { get; set; }
public Boolean HasNextPage { get; set; }
public Boolean HasPreviousPage { get; set; }
public int TotalItemCount { get; set; }
}
Я хочу, чтобы он возвращал метаданные о разбиении на страницы , это должно работать рука об руку с моим классом разбивки на страницы, который выглядит так
public class PaginatedList<T> : List<T>
{
public int PageIndex { get; private set; }
public int TotalPages { get; private set; }
public PaginatedList(List<T> items, int count, int pageIndex, int pageSize)
{
PageIndex = pageIndex;
TotalPages = (int)Math.Ceiling(count / (double)pageSize);
this.AddRange(items);
}
public bool HasPreviousPage
{
get
{
return (PageIndex > 1);
}
}
public bool HasNextPage
{
get
{
return (PageIndex < TotalPages);
}
}
public static async Task<PaginatedList<T>> CreateAsync(IQueryable<T> source, int pageIndex, int pageSize)
{
var count = await source.CountAsync();
var items = await source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync();
return new PaginatedList<T>(items, count, pageIndex, pageSize);
}
}
Опять же, как я уже сказал, разбивка на страницы работает отлично, проблема возникла, когда мне нужно было вернуть PaginatedResponse
, а не PaginatedList
, поэтому я изменил метод CreateAsync
, чтобы он выглядел так
public static async Task<PaginatedResponse<T>> CreateAsync(IQueryable<T> source, int pageIndex, int pageSize)
{
var count = await source.CountAsync();
var items = await source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync();
var totalPages = (int)Math.Ceiling(count / (double)pageSize);
return new PaginatedResponse<T>
{
PageSize = pageSize,
TotalItemCount = count,
HasNextPage = pageIndex < totalPages,
HasPreviousPage = pageIndex > 1,
PaginatedList = new PaginatedList<T>(items, count, pageIndex, pageSize)
};
}
Моя проблема теперь в том, когда я пытаюсь вызвать CreateAsync
, например
IQueryable<MyClass> source = SourceCreator.CreateSource();
return await PaginatedList<PaginatedResponse<MyClass>>.CreateAsync(source, page, pageSize);
Выдает ошибку
cannot convert from 'System.Linq.IQueryable<MyClass>' to 'System.Linq.IQueryable<PaginatedResponse<MyClass>>'
Как исправить?