【问题标题】:Where best to add filtering in GraphQL?在 GraphQL 中哪里最好添加过滤?
【发布时间】:2022-08-18 22:56:14
【问题描述】:

我了解可以在查询中应用过滤条件,例如

query{
    MyObject(where: {id: {eq: 1}}){
        id
        name
    }
}

这将访问服务器端查询:

[UseDbContext(typeof(dbContext))]
    [UseProjection]
    [UseFiltering]
    [UseSorting]
    public IQueryable<MyObject> GetMyObject([ScopedService] dbContext context)
    {
        return context.MyObject;
    }

这也可以在服务器端查询上表达,例如(.Net 实现)。

query{
    GetMyObjectById(id: 1){
        id
        name
    }
}

public async Task<MyObject> GetMyObjectById(int id)
{
    return dbContext.MyObject.FindAsync(id);
}

我的问题是,为什么要使用一个而不是另一个?

    标签: graphql hotchocolate


    【解决方案1】:

    我已经看到了同时使用这两种方法的建议(相当广泛)。但是对于第二种情况,通常建议稍微不同的实现。他们建议接受一组 id(不是单个),以便能够通过单个查询接收一批对象。更进一步,建议使用批处理加载器来合并用户所有不同请求中的所有 id,这将使查询更加高效。

    在我们 API 的第一个版本中,我们遵循了所描述的方式,但现在我们将为所有实体删除第二种方法,如果第一种方法适用于它们。正如我们在 API 的客户端中看到的,不需要持有两个版本的获取实体,客户端很乐意为此使用单个端点。第一种方法足够灵活,可以满足我们的所有需求。无论我们是想通过单个 ID、多个 ID 还是任何搜索谓词进行查询 - 一切都可以通过单个端点轻松完成。

    还有一点技术要点:但是,如果您想保留带有 id 的方法,请考虑接受 id 数组,如果您使用 [UseProjection] 以降低实现成本很重要。 FindAsync 显然会具体化对象的所有字段,但如果您通过 id 返回 IQueryable,您可以将 [UseProjection] 应用于该可查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 2015-11-24
      • 2016-07-30
      相关资源
      最近更新 更多