【发布时间】:2020-05-08 07:50:26
【问题描述】:
我正在学习 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>>'
我该如何解决这个问题?
【问题讨论】:
-
CreateAsync返回一个PaginatedResponse<T>。您的T是MyClass。PaginatedResponse<MyClass>与PaginatedList<PaginatedResponse<MyClass>>不同。 -
CreateAsync是PaginatedList类中的一个静态方法,要访问它我需要执行PaginatedList.CreateAsync之类的操作,但因为它有返回值,所以我需要知道如何调用它跨度> -
换句话说,当您调用
PaginatedList<PaginatedResponse<MyClass>>.CreateAsync([...])时,T现在是PaginatedResponse<MyClass>(并且不是MyClass!)。但是你给它一个source的IQueryable<MyClass>并且该方法正确地拒绝了:嘿,我想要一个IQueryable<T>。我的T是PaginatedResponse<MyClass>,所以我期待IQueryable<PaginatedResponse<MyClass>>。但是你给了我一个IQueryable<MyClass>,好像你期望我的T是MyClass(它不是)。如果您希望 that 起作用,请询问我的兄弟PaginatedList<MyClass>至CreateAsync。也许他们可以提供帮助。
标签: c# linq linq-to-sql