问题描述
我正在尝试创建Graphql模式,并且正在创建模式,但是看不到Id(MongoDb ObjectId类型)的过滤选项。你能告诉我我在想什么吗?我也想按ID进行过滤,但是在创建的架构上没有类似的选项。您可以在下面看到我的测试实现。
public class Startup
{
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
TypeConversion.Default.Register<string,ObjectId>(from => ObjectId.Parse(from));
TypeConversion.Default.Register<ObjectId,string>(from => from.ToString());
services.AddSingleton<IAuthorService,InMemoryAuthorService>();
services.AddGraphQL(s => SchemaBuilder.New()
.AddServices(s)
.AddType<AuthorType>()
.AddQueryType<Query>()
.BindClrType<ObjectId,IdType>()
.Create());
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app,IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UsePlayground(new PlaygroundOptions
{
QueryPath = "/api",Path = "/playground"
});
}
app.UseRouting();
app.UseGraphQL("/api");
}
}
public class AuthorType : ObjectType<Author>
{
protected override void Configure(IObjectTypeDescriptor<Author> descriptor)
{
descriptor.Field(t => t.Id)
.Type<IdType>()
.Resolver(c => c.Parent<Author>().Id);
descriptor.Field(a => a.AuthorId).Type<StringType>();
descriptor.Field(a => a.Name).Type<StringType>();
descriptor.Field(a => a.Surname).Ignore();
}
}
public class Author
{
public ObjectId Id { get; set; }
public int AuthorId { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
}
public class Query
{
private readonly IAuthorService _authorService;
public Query(IAuthorService authorService)
{
_authorService = authorService;
}
[UsePaging]
[UseFiltering]
public IQueryable<Author> Authors() => _authorService.GetAll();
}
public interface IAuthorService
{
IQueryable<Author> GetAll();
}
public class InMemoryAuthorService : IAuthorService
{
private IList<Author> _authors;
public InMemoryAuthorService()
{
_authors = new List<Author>()
{
new Author() {Id = ObjectId.Parse("5e4442c28ae77cb23386b911"),AuthorId = 1,Name = "Name 1",Surname = "Surname 1"},new Author() {Id = ObjectId.Parse("5e4442c28ae77cb23386b912"),AuthorId = 2,Name = "Name 2",Surname = "Surname 2"},new Author() {Id = ObjectId.Parse("5e4442c28ae77cb23386b913"),AuthorId = 3,Name = "Name 4",Surname = "Surname 3"}
};
}
public IQueryable<Author> GetAll()
{
return _authors.AsQueryable();
}
}
解决方法
当您绑定 ObjectId 类型并注册序列化时,这应该可以工作
builder.BindRuntimeType<ObjectId,IdType>();
builder.AddTypeConverter<ObjectId,string>(o => o.ToString());
builder.AddTypeConverter<string,ObjectId>(o => ObjectId.Parse(o));
您可以在此处的文档中阅读有关标量的更多信息: https://chillicream.com/docs/hotchocolate/defining-a-schema/scalars/#custom-converter