You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何编写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查询示例

现在你可以用两种方式查询:

  1. 原有按ID查询单用户(依然有效):
query { 
  person(id:"4090D8F6-EFC4-42CD-B55C-E2203537380C") { 
    firstname 
    surname 
  } 
}
  1. 按名字过滤用户列表
  • 同时按名和姓过滤:
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

火山引擎 最新活动