LoginSignup
1
0

C#でGraphQLその2(やるなホットチョコレート)

Last updated at Posted at 2023-10-26

引き続き、ホットチョコレートを調査したいと思います。
今回はフィルタリングとページネーションを調査したいと思います。

前回の記事はこちら
C#でGraphQL(なぜホットチョコレート?!)

簡単でした!

結論としてはNugetでのモジュール追加とQueryクラスの関数にアトリビュートを追加するだけでした。

  • フィルタリングも1通りの機能が揃っていてカスタマイズもできるようです。
  • ページネーションは「Cursor Connections」という仕様のようです。

手順は以下です。

  1. Nugetで"HotChocolate.Data"を追加してください。
    image.png

  2. [UsePaging]と[UseFiltering]アトリビュートを追加してください。

    public class Query
    {
        [UsePaging]
        [UseFiltering]
        public IEnumerable<Author> Authors([Service] Repository repository) =>
            repository.GetAuthors();
        [UsePaging]
        [UseFiltering]
        public IEnumerable<Book> Books([Service] Repository repository) =>
            repository.GetBooks();
    }
    

テスト

フィルタリング
image.png

ページネーション1
image.png

ページネーション2 (afterにendCursorを設定すると次の1件取得)
image.png

感想

なんかHotChocolateよくできてますね。
次は本丸のEFCoreでSQLServerに接続してみたいと思います。
N+1とかどうなっているんでしょうか

コード

一応コードも載せておきますので、試したい場合はProgram.csを置き換えてください。
とはいっても4行くらい追加しただけだけど。。。

var builder = WebApplication.CreateBuilder(args);
builder.Services
    .AddSingleton<Repository>()
    .AddGraphQLServer()
    .AddQueryType<Query>()
    .AddFiltering()
    .AddType<Author>()
    .AddType<Book>();
var app = builder.Build();

app.MapGraphQL();

app.Run();

public class Query
{
    [UsePaging]
    [UseFiltering]
    public IEnumerable<Author> Authors([Service] Repository repository) =>
        repository.GetAuthors();
    [UsePaging]
    [UseFiltering]
    public IEnumerable<Book> Books([Service] Repository repository) =>
        repository.GetBooks();
}

public class Author
{
    public int Id { get; set; }
    public string Name { get; set; }
    [UsePaging]
    [UseFiltering]
    public List<Book> Books { get; set; }
}
[UsePaging]
public class Book
{
    public int Id { get; set; }
    public string Title { get; set; }
    public Author Author { get; set; }
}
public class Repository
{
    private readonly List<Author> _authors;
    public Repository()
    {
        //データ登録
        _authors = new List<Author>();

        //川端康成
        var auther = new Author
        {
            Id = 1, Name = "川端康成",
        };
        auther.Books = new List<Book>
        {
            new Book { Id = 11, Title = "雪国", Author = auther},
            new Book { Id = 12, Title = "伊豆の踊り子", Author = auther}
        };
        _authors.Add(auther);

        //夏目漱石
        auther = new Author
        {
            Id = 2, Name = "夏目漱石",
        };
        auther.Books = new List<Book>
        {
            new Book { Id = 21, Title = "坊ちゃん", Author = auther},
            new Book { Id = 22, Title = "三四郎", Author = auther}
        };
        _authors.Add(auther);
    }
    public IEnumerable<Author> GetAuthors()
    {
        return _authors;
    }
    public IEnumerable<Book> GetBooks()
    {
        return _authors.SelectMany(x => x.Books);
    }
}

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0