首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GraphQL HotChocolate上的滤波EF核心导航特性

GraphQL HotChocolate上的滤波EF核心导航特性
EN

Stack Overflow用户
提问于 2021-04-23 15:11:19
回答 2查看 492关注 0票数 1

我使用HotChocolate (11.2.2)与EF,并希望过滤一个子属性。根据GraphQL文档,这应该可以通过在导航属性上使用filter关键字来实现,但是HotChocolate失败了。

我的模式:

代码语言:javascript
复制
type A {
    Name: string,
    RefTo: [B]
}
type B {
    TypeName: string,
    Value: int
}

这是由EF支持的,我为HotChocolate提供了一个HotChocolate。

代码语言:javascript
复制
    [UsePaging]
    [UseProjection]
    [UseFiltering]
    [UseSorting]
    public IQueryable<A> GetAs([Service] Context db) => db.As.AsSingleQuery().AsNoTrackingWithIdentityResolution();

现在,我只想包括那些Bs,其中TypeName等于"ExampleType",如下所示:

代码语言:javascript
复制
query {
   As {
      Name,
      RefTo(where: { TypeName: { eq: "ExampleType" } })
      {
          TypeName,
          Value
      }
   }
}

但HotChcolate似乎不明白这一点,并说:

未知参数"where“on field "A.RefTo".validation

可以用EF核心模型过滤导航属性吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-23 15:44:24

您也必须向RefTo添加过滤。

代码语言:javascript
复制
    [UseFiltering] 
    public ICollection<A> RefTo {get; set;}
票数 5
EN

Stack Overflow用户

发布于 2022-03-31 03:32:50

如果要将UseFilteringUseSorting等应用于具有结果类型ICollection的所有字段,则可以使用TypeInterceptor

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using HotChocolate.Configuration;
using HotChocolate.Types;
using HotChocolate.Types.Descriptors;
using HotChocolate.Types.Descriptors.Definitions;

namespace MyApp
{
    public class FilterCollectionTypeInterceptor : TypeInterceptor
    {
        private static bool IsCollectionType(Type t)
            => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(ICollection<>);

        public override void OnBeforeRegisterDependencies(ITypeDiscoveryContext discoveryContext, DefinitionBase? definition,
            IDictionary<string, object?> contextData)
        {
            if (definition is not ObjectTypeDefinition objectTypeDefinition) return;
            
            for (var i = 0; i < objectTypeDefinition.Fields.Count; i++)
            {
                var field = objectTypeDefinition.Fields[i];
                if (field.ResultType is null || !IsCollectionType(field.ResultType)) continue;
                
                var descriptor = field.ToDescriptor(discoveryContext.DescriptorContext)
                    .UseFiltering()
                    .UseSorting();
                objectTypeDefinition.Fields[i] = descriptor.ToDefinition();
            }
        }
    }
}

请看我的要点:https://gist.github.com/zliebersbach/b7db2b2fcede98f220f55aa92276ad6e#file-filtercollectiontypeinterceptor-cs

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67232513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档