【问题标题】:Aspnet core Hotchocolate GrahpQl Query not picking up argumentsAsp Net core Hotchocolate GraphQl Query 不接受参数
【发布时间】:2020-09-17 09:07:02
【问题描述】:

您好,我有以下查询类:

public class haProgrammesQuery
    {
        [UseFiltering]
        public async Task<IQueryable<User>> GetUsers([Service] haProgrammesContext Context) => Context.Users;
        
        
        [UseFiltering]
        [UseFirstOrDefault]
        public async Task<IQueryable<User>> GetUserById([Service] haProgrammesContext Context, string Id) { 
        return Context.Users.Where(u => u.UserId.ToString() == Id);
        } 
    }

使用查询在操场上运行良好:

query {
users{
    userId
    name
  }
}

但查询

query{
 userById(id:"fd8b8670-60cf-451a-8fea-0fc0c69cde3a")
  {
    name
  }
}

调用 UserById 方法(使用断点检查),但 string Id 参数为空,因此返回到 Playground 的响应为空。

我还使用了一个基本的 echo 方法来返回字符串参数,但它也收到了一个 null 参数,并且还使用了async Task&lt;IQueryable&lt;User&gt;&gt;(因为这个版本是,是的,我知道它没有使用等待)而且只是标准的IQueryable&lt;User&gt; 只是为了看看那里是否有任何东西 - 我错了什么?!

【问题讨论】:

  • 不应该Id 是一个指导?除非 EF Core 足够聪明,可以忽略 u.UserId.ToString() ,否则这将导致全表扫描

标签: asp.net-core graphql hotchocolate


【解决方案1】:

Hotchocolate(或沿途的某种形式的中间件)解释参数名称并在将其放入架构时包含一个小写的首字母

因此

        [UseFiltering]
        [UseFirstOrDefault]
        public async Task<IQueryable<User>> GetUserById([Service] haProgrammesContext Context, string Id) { 
        return Context.Users.Where(u => u.UserId.ToString() == Id);
        } 

需要

        [UseFirstOrDefault]
        public async Task<IQueryable<User>> GetUserById([Service] haProgrammesContext Context, string id) { 
        return Context.Users.Where(u => u.UserId.ToString() == id);
        } 

让它运行(Id 上的小写 i)

因此... MyCamelCaseArgumentName 需要是 myCamelCaseArgumentName 等...

【讨论】:

  • 你应该使用Guid参数,而不是字符串,否则覆盖UserId的索引将不会被使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 2022-11-07
  • 2019-07-28
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多