热巧克力:转换 [UseFiltering] 查询的结果
Hot Chocolate: Transforming results from [UseFiltering] Query
我希望使用 Hot Chocolate 的过滤来查询一种数据类型;然后将过滤后的输出转换为另一种类型,然后再将其作为 IQueryable 返回。但我似乎无法找到捕获过滤器输入以开始转换的方法。
这是我要完成的示例:
给定数据类
public class TypeA
{
public string Foo { get; set; }
}
public class TypeB
{
public string Fizz { get; set; }
public string Buzz { get; set; }
}
我希望能够创建一个像
这样的查询端点
public class Query
{
[UseDbContext(typeof(DbContext))]
[UseFiltering(typeof(TypeA))]
public IQueryable<TypeB> GetTypeB(
[ScopedService] DbContext context,
[SomeAttributeToCaptureTheFilter] Filter filter) // <- this is the line I'm trying to figure out
{
IQueryable<TypeA> filteredTypeAs = context.TypeA.Filter(filter); // .Filter() doesn't exist, its just for example.
IQueryable<TypeB> filteredTypeBs;
/* Complex transformation logic that populates 'filteredTypeBs'
* requiring the 'filteredTypeAs' and additional Data from
* the database to complete. */
return filteredTypeBs;
}
}
针对它,我可以使用如下所示的 GraphQL 查询
query {
typeB(where: { foo: { eq: "bar" } }) {
fizz
buzz
}
}
where: { foo: { eq: "bar" } }
作为针对 TypeA
和
的过滤器
typeB {
fizz
buzz
}
从转换后的 TypeB
中提取内容。
使用 [UseFiltering(typeof(TypeA))]
确实有效,它设置了我想要的模式。
我要找的是 [SomeAttributeToCaptureTheFilter] Filter filter
行的效果。只是捕获过滤器并将其应用于 DbContext 中的数据的某种方式。
我还要说我对 GraphQL 总体来说还是个新手,所以我处理这个问题的方式可能是完全错误的。任何建议都会有所帮助。
为将来可能偶然发现此问题的任何人回答我自己的问题。
答案在 HotChocolate.Data
包中。它包含 IQueryable<T>
和 IEnumerable<T>
的 Filter
扩展;这允许您通过传递 IResolverContext
来 运行 过滤器内联。我在文档中找不到对此的任何引用,我在一个关于数据聚合的示例中遇到了它:https://github.com/ChilliCream/hotchocolate/issues/924#issuecomment-921793977
这基本上就是我最终的查询方法的样子:
using HotChocolate.Data;
using HotChocolate.Data.Filters.Expressions;
public class Query
{
[UseDbContext(typeof(DbContext))]
[UseFiltering(typeof(TypeA))]
public IQueryable<TypeB> GetTypeB(
[ScopedService] DbContext context,
IResolverContext resolverContext)
{
IQueryable<TypeA> filteredTypeAs = context.TypeA.Filter(resolverContext);
IQueryable<TypeB> filteredTypeBs;
/* Complex transformation logic that populates 'filteredTypeBs'
* requiring the 'filteredTypeAs' and additional Data from
* the database to complete. */
return filteredTypeBs;
}
}
我知道我的例子有点深奥,但关键是它在查询方法本身中打开了对结果的过滤版本的访问。这为数据带来了无限可能 aggregation/manipulation;同时仍然利用 HotChocolate 的内置功能。
作为旁注,似乎还有一个 Sort
扩展名,相当于 [UseSorting]
.
我希望使用 Hot Chocolate 的过滤来查询一种数据类型;然后将过滤后的输出转换为另一种类型,然后再将其作为 IQueryable 返回。但我似乎无法找到捕获过滤器输入以开始转换的方法。
这是我要完成的示例:
给定数据类
public class TypeA
{
public string Foo { get; set; }
}
public class TypeB
{
public string Fizz { get; set; }
public string Buzz { get; set; }
}
我希望能够创建一个像
这样的查询端点public class Query
{
[UseDbContext(typeof(DbContext))]
[UseFiltering(typeof(TypeA))]
public IQueryable<TypeB> GetTypeB(
[ScopedService] DbContext context,
[SomeAttributeToCaptureTheFilter] Filter filter) // <- this is the line I'm trying to figure out
{
IQueryable<TypeA> filteredTypeAs = context.TypeA.Filter(filter); // .Filter() doesn't exist, its just for example.
IQueryable<TypeB> filteredTypeBs;
/* Complex transformation logic that populates 'filteredTypeBs'
* requiring the 'filteredTypeAs' and additional Data from
* the database to complete. */
return filteredTypeBs;
}
}
针对它,我可以使用如下所示的 GraphQL 查询
query {
typeB(where: { foo: { eq: "bar" } }) {
fizz
buzz
}
}
where: { foo: { eq: "bar" } }
作为针对 TypeA
和
typeB {
fizz
buzz
}
从转换后的 TypeB
中提取内容。
使用 [UseFiltering(typeof(TypeA))]
确实有效,它设置了我想要的模式。
我要找的是 [SomeAttributeToCaptureTheFilter] Filter filter
行的效果。只是捕获过滤器并将其应用于 DbContext 中的数据的某种方式。
我还要说我对 GraphQL 总体来说还是个新手,所以我处理这个问题的方式可能是完全错误的。任何建议都会有所帮助。
为将来可能偶然发现此问题的任何人回答我自己的问题。
答案在 HotChocolate.Data
包中。它包含 IQueryable<T>
和 IEnumerable<T>
的 Filter
扩展;这允许您通过传递 IResolverContext
来 运行 过滤器内联。我在文档中找不到对此的任何引用,我在一个关于数据聚合的示例中遇到了它:https://github.com/ChilliCream/hotchocolate/issues/924#issuecomment-921793977
这基本上就是我最终的查询方法的样子:
using HotChocolate.Data;
using HotChocolate.Data.Filters.Expressions;
public class Query
{
[UseDbContext(typeof(DbContext))]
[UseFiltering(typeof(TypeA))]
public IQueryable<TypeB> GetTypeB(
[ScopedService] DbContext context,
IResolverContext resolverContext)
{
IQueryable<TypeA> filteredTypeAs = context.TypeA.Filter(resolverContext);
IQueryable<TypeB> filteredTypeBs;
/* Complex transformation logic that populates 'filteredTypeBs'
* requiring the 'filteredTypeAs' and additional Data from
* the database to complete. */
return filteredTypeBs;
}
}
我知道我的例子有点深奥,但关键是它在查询方法本身中打开了对结果的过滤版本的访问。这为数据带来了无限可能 aggregation/manipulation;同时仍然利用 HotChocolate 的内置功能。
作为旁注,似乎还有一个 Sort
扩展名,相当于 [UseSorting]
.