GraphQL запрашивает свойства класса реализации, но в схеме я упомянул только интерфейс, как?

#c# #graphql #hotchocolate

Вопрос:

Я объявил класс модели, подобный приведенному ниже.

 public class FunctionalOrganization : IOrganization
{
    public Guid Id { get; set; }
    public string LegalName { get; set; }
    public string Name { get; set; }
    public IAddress LegalAddress { get; set; }
}
 

И интерфейс IAddress выглядит так, как показано ниже

 public interface IAddress : IModel
{
  string PrimaryLine { get; set; }
  string AdditionalLine { get; set; }
  string Country { get; set; }
}
 

И реализация (UnitedStatesAddress) (один из) IAddres выглядит следующим образом

 public class UnitedStatesAddress : IAddress
{
    public string PrimaryLine { get; set; }
    public string AdditionalLine { get; set; }
    public string Country { get; set; }
    public Guid Id { get; set; }
    public string City { get; set; }
    public string ZipCode { get; set; }
    public string State { get; set; }
}
 

Если я хочу запросить API Graphql для получения города, почтового индекса и штата с адреса IAddress, он не выдает и не показывает ошибку.

  query {
  organizationById (organizationId: "00000000-0000-0000-0000-000000000001"){
legalName
legalAddress {
  country
  primaryLine
  additionalLine
  state
}
id
registeredOn
asResponder {
   settings {
     isVisible
     dataCenterLocation
   }
}
  }
}
 

и ошибка выглядит так, как показано ниже.

   {
  "errors": [
    {
      "message": "The field `state` does not exist on the type `Address`.",
      "locations": [
        {
          "line": 8,
          "column": 7
        }
      ],
      "path": [
        "organizationById",
        "legalAddress"
      ],
      "extensions": {
        "type": "Address",
        "field": "state",
        "responseName": "state",
        "specifiedBy": "http://spec.graphql.org/June2018/#sec-Field-Selections-on-Objects-Interfaces-and-Unions-Types"
      }
    }
  ]
}
 

Может ли кто-нибудь помочь мне решить эту проблему ?

Комментарии:

1. вы должны добавить состояние в IAdress, потому что у LegalAdress есть IAdress типа не UnitedStateAdress

2. graphql.org/learn/schema/#interfaces

Ответ №1:

Вы должны выбрать реализацию интерфейса в запросе

  query {
  organizationById (organizationId: "00000000-0000-0000-0000-000000000001"){
     legalName
     legalAddress {
       country
      primaryLine
      additionalLine
      ... on UnitedStatesAddress {
         state
      }
    }
     id
     registeredOn
     asResponder {
       settings {
         isVisible
         dataCenterLocation
       }
    }
  }
}