如何通过GraphQL访问类IList成员?

问题描述 投票:0回答:1

我有一个像这样的简单 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...) 。我知道我可以重构该方法以返回新模型,但这是额外的工作。

c# graphql hotchocolate
1个回答
0
投票

嗯,我想,它并没有以这种方式实施,因为这个想法相当模糊且有争议。 IE。并非所有 graphql API 的开发人员都会支持这一点。

举个例子,假设它将被实施。 但是对书籍集合进行查询时,您定义了集合项字段选择,但没有定义集合属性选择。现在需要更改该方法 - 要请求集合属性,必须引入额外的层次结构级别:

books
{
 pageIndex 
 pageSize
 totalCount

 items
 {
  title
  author
  { 
   name
  }
 }
}

当自动获得新的层次结构级别(即items)时,每个人都会感到高兴吗?我不知道。 好吧,假设引入了新级别。但是,接口或类的哪些属性必须自动公开,因为它们中的许多属性可能仅用于编程用途而不是用于 API?考虑最简单的情况 - IList。是否应该公开其属性IsReadOnly?显然,这对于这两个 API 实现都没有意义。 因此,即使这个想法乍一看是值得的,但实际上,其“开箱即用”的实现不太可能令任何人满意。 关于您可能值得考虑的特定情况

偏移分页

- 它是对分页列表的开箱即用支持(您尝试使用 PagedList 实现的功能)。

© www.soinside.com 2019 - 2024. All rights reserved.