gpt4 book ai didi

c# - 使用 HotChocolate 按 ObjectId 类型过滤

转载 作者:行者123 更新时间:2023-12-05 03:47:57 25 4
gpt4 key购买 nike

我正在尝试创建一个 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();
}
}

enter image description here

最佳答案

这应该在您绑定(bind) 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

关于c# - 使用 HotChocolate 按 ObjectId 类型过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64648326/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com