我有一个像这样的简单 Graphql 查询
public class Query
{
public async Task<IPagedList<Book>> Books(int pageIndex, int pageSize)
{
var data = new List<Book>() {
new()
{
Title = "C# in depth.",
Author = new Author
{
Name = "Jon Skeet"
}
},new()
{
Title = "How to cook Phở",
Author = new Author
{
Name = "Nam Vo"
}
},new()
{
Title = "How to cook Phở2",
Author = new Author
{
Name = "Nam Vo"
}
},new()
{
Title = "How to cook Phở3",
Author = new Author
{
Name = "Nam Vo"
}
}
};
var ret= await data.ToPagedListAsync(pageIndex, pageSize, data.Count);
return ret;
}
}
PagedList 的定义:
public interface IPagedList<T> : IList<T>
{
int PageIndex { get; }
int PageSize { get; }
int TotalCount { get; }
int TotalPages { get; }
bool HasPreviousPage { get; }
bool HasNextPage { get; }
}
public class PagedList<T> : List<T>, IPagedList<T>
{
public PagedList(IList<T> source, int pageIndex, int pageSize, int? totalCount = null)
{
//min allowed page size is 1
pageSize = Math.Max(pageSize, 1);
TotalCount = totalCount ?? source.Count;
TotalPages = TotalCount / pageSize;
if (TotalCount % pageSize > 0)
TotalPages++;
PageSize = pageSize;
PageIndex = pageIndex;
AddRange(totalCount != null ? source : source.Skip(pageIndex * pageSize).Take(pageSize));
}
public int PageIndex { get; private set; }
public int PageSize { get; private set; }
public int TotalCount { get; private set; }
public int TotalPages { get; private set; }
public bool HasPreviousPage => PageIndex > 0;
public bool HasNextPage => PageIndex + 1 < TotalPages;
}
调用ToPagedListAsync的静态类:
public static async Task<IPagedList<T>> ToPagedListAsync<T>(this IEnumerable<T> source,
int pageIndex,
int pageSize,
int totalCount)
{
if (source == null)
return new PagedList<T>(new List<T>(), pageIndex, pageSize);
//min allowed page size is 1
pageSize = Math.Max(pageSize, 1);
var data = new List<T>();
data.AddRange(await source.Skip(pageIndex * pageSize)
.Take(pageSize)
.ToAsyncEnumerable()
.ToListAsync());
return new PagedList<T>(data, pageIndex, pageSize, totalCount);
}
结果返回数据源的子集。我只是想知道为什么通过 Graphql 我无法访问 PagedList 成员 (pageIndex、pageSize、totalCount、hasPreviousPage...) 。我知道我可以重构该方法以返回新模型,但这是额外的工作。
嗯,我想,它并没有以这种方式实施,因为这个想法相当模糊且有争议。 IE。并非所有 graphql API 的开发人员都会支持这一点。
举个例子,假设它将被实施。 但是对书籍集合进行查询时,您定义了集合项字段选择,但没有定义集合属性选择。现在需要更改该方法 - 要请求集合属性,必须引入额外的层次结构级别:
books
{
pageIndex
pageSize
totalCount
items
{
title
author
{
name
}
}
}
当自动获得新的层次结构级别(即items)时,每个人都会感到高兴吗?我不知道。 好吧,假设引入了新级别。但是,接口或类的哪些属性必须自动公开,因为它们中的许多属性可能仅用于编程用途而不是用于 API?考虑最简单的情况 - IList。是否应该公开其属性IsReadOnly?显然,这对于这两个 API 实现都没有意义。 因此,即使这个想法乍一看是值得的,但实际上,其“开箱即用”的实现不太可能令任何人满意。 关于您可能值得考虑的特定情况
偏移分页 - 它是对分页列表的开箱即用支持(您尝试使用 PagedList 实现的功能)。