如何编写GraphQL查询按名字查询用户并兼容现有ID查询
解决方案:兼容ID查询+新增按名字过滤用户列表
没问题,我来帮你搞定这个需求——既要保留原有的按ID查询单用户功能,又要新增按名字过滤用户列表的功能,同时解决原来ID非空校验的阻碍。
一、修改PersonQuery代码
核心改动有两点:一是去掉ID参数的非空限制,二是新增返回用户列表的persons字段。这里直接给你修改后的完整代码:
public class PersonQuery : ObjectGraphType<Person> { public PersonQuery(ShoppingData data) { // 保留原有按ID查询单用户的功能,去掉NonNullGraphType让ID参数可选 Field<PersonType>( name: "person", description: "A Person", arguments: new QueryArguments( new QueryArgument<IdGraphType> { Name = "id", Description = "The id of the person" }), resolve: ctx => { var id = ctx.GetArgument<Guid?>("id"); // 若ID为空则返回null,不影响其他字段的使用 return id.HasValue ? data.GetById(id.Value) : null; }); // 新增按名字过滤用户列表的字段 Field<ListGraphType<PersonType>>( name : "persons", description: "Filter persons by firstname or surname", arguments: new QueryArguments( new QueryArgument<StringGraphType> { Name = "firstname", Description = "Filter by firstname (supports partial match if your data layer allows)" }, new QueryArgument<StringGraphType> { Name = "surname", Description = "Filter by surname (supports partial match if your data layer allows)" }), resolve: ctx => { var firstName = ctx.GetArgument<string>("firstname"); var surname = ctx.GetArgument<string>("surname"); // 这里假设你的ShoppingData已实现Filter方法,用于过滤静态数据 // 若未实现,可参考下方的简单实现思路 return data.Filter(firstName, surname); }); } }
二、可用的GraphQL查询示例
现在你可以用两种方式查询:
- 原有按ID查询单用户(依然有效):
query { person(id:"4090D8F6-EFC4-42CD-B55C-E2203537380C") { firstname surname } }
- 按名字过滤用户列表:
- 同时按名和姓过滤:
query { persons(firstname: "Andrew", surname: "P") { firstname surname id # 可按需返回更多字段 } }
- 只按名过滤:
query { persons(firstname: "Andrew") { firstname surname } }
- 只按姓过滤:
query { persons(surname: "P") { firstname surname } }
小提示:如果未实现Filter方法的话
假设你的静态数据是一个List<Person>,可以参考这个简单的Filter实现:
public List<Person> Filter(string firstName, string surname) { var result = _persons.AsQueryable(); if (!string.IsNullOrEmpty(firstName)) { // 可根据需求选择精确匹配或包含匹配,这里用不区分大小写的精确匹配 result = result.Where(p => p.firstname.Equals(firstName, StringComparison.OrdinalIgnoreCase)); } if (!string.IsNullOrEmpty(surname)) { result = result.Where(p => p.surname.Equals(surname, StringComparison.OrdinalIgnoreCase)); } return result.ToList(); }
内容的提问来源于stack exchange,提问作者Andrew




