List & Non-Null
In addition to the six fundamental graph types, GraphQL contains two meta graph types: LIST and NON_NULL.
NON_NULL: Indicates that the Graph Type its describing must not be a null value, be that as an input argument or returned from a fieldLIST: Indicates that GraphQL should expect a collection of objects instead of just a single item.
These meta types aren't anything concrete like a scalar or an enum. Instead they "wrap" another graph type (such as int or Donut). They are used to describe the usage of a graph type in a field or input argument:
For example, we would say:
- "A field that returns a
Floatnumber." - "A field that must return a
Person." - "An input argument that must be a
Date."
We can even describe complex scenarios:
- "A field that might return a collection of
personsbut when returned, each person must be a valid reference." - "An input argument that must be a list that contains lists of
integers." (e.g.[[1, 2], [5, 15]])
Type Expressions
Together these "wrappers" make up a field's Type Expression. GraphQL ASP.NET will automatically infer a type expression for every field and every input argument when generating your schema.
The following assumptions about your data are made when creating type expressions:
✅ Reference types can be null
✅ Value types cannot be null
✅ Nullable value types (e.g. int?) can be null
✅ When a reference type implements IEnumerable<TType> it will be expressed as a "list of TType"
Type Expressions are commonly shown in the GraphQL schema syntax for field definitions. Here are a few examples of a .NET type and its equivalent type expression in schema syntax.
| .NET Type | Type Expression |
|---|---|
| int | Int! |
| float? | Float |
| IEnumerable<Person> | [Person] |
| Person[] | [Person] |
| List<bool> | [Boolean!] |
| IReadOnlyList<long> | [Long!] |
| IReadOnlyList<long?> | [Long] |
| IEnumerable<List<ICollection<Donut>>> | [[[Donut]]] |
The
!indicates NON_NULL and[]for a LIST.
Overriding Type Expressions
You may need to override the default behavior from time to time. For instance, a string, which is a reference type, is nullable by default but you may want to enforce non-nullability at the query level and declare that null is not valid for a given argument. Or, perhaps, an object implements IEnumerable but you don't want graphql to treat it as a list.
You can override the default type expression of any field or argument by defining a custom type expression when needed.