EntityGraphQL 2.0.0-beta3
See the version list below for details.
dotnet add package EntityGraphQL --version 2.0.0-beta3
NuGet\Install-Package EntityGraphQL -Version 2.0.0-beta3
<PackageReference Include="EntityGraphQL" Version="2.0.0-beta3" />
paket add EntityGraphQL --version 2.0.0-beta3
#r "nuget: EntityGraphQL, 2.0.0-beta3"
// Install EntityGraphQL as a Cake Addin #addin nuget:?package=EntityGraphQL&version=2.0.0-beta3&prerelease // Install EntityGraphQL as a Cake Tool #tool nuget:?package=EntityGraphQL&version=2.0.0-beta3&prerelease
Entity GraphQL
A GraphQL library for .NET Core
Jump into the https://entitygraphql.github.io/ for documentation and to get started.
Entity GraphQL is a .NET Core (netstandard 2.1) library that allows you to easily build a GraphQL API on top of your data with the extensibility to bring multiple data sources together in the single GraphQL schema.
It can also be used to execute simple LINQ-style expressions at runtime against a given object which provides powerful runtime configuration.
Please explore, give feedback or join the development.
If you're looking for a dotnet library to generate code to query an API from a GraphQL schema see https://github.com/lukemurray/DotNetGraphQLQueryGen
Installation
Via Nuget
Quick Start with Entity Framework
Note: There is no dependency on EF. Queries are compiled to IQueryable
or IEnumberable
linq expressions. EF is not a requirement - any ORM working with LinqProvider
or an in-memory object will work - although EF well is tested.
1. Define your data context (in this example an EF context)
public class DemoContext : DbContext {
public DemoContext(DbContextOptions options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder) {
// Set up your relations
}
public DbSet<Property> Properties { get; set; }
public DbSet<PropertyType> PropertyTypes { get; set; }
public DbSet<Location> Locations { get; set; }
}
public class Property {
public uint Id { get; set; }
public string Name { get; set; }
public PropertyType Type { get; set; }
public Location Location { get; set; }
}
public class PropertyType {
public uint Id { get; set; }
public string Name { get; set; }
public decimal Premium { get; set; }
}
public class Location {
public uint Id { get; set; }
public string Name { get; set; }
}
2. Create a route
Here is an example for a ASP.NET. You will also need to install EntityGraphQL.AspNet to use MapGraphQL
. You can also build you own endpoint, see docs.
public class Startup {
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<DemoContext>(opt => opt.UseInMemoryDatabase());
// This registers a SchemaProvider<DemoContext>
services.AddGraphQLSchema<DemoContext>();
}
public void Configure(IApplicationBuilder app, DemoContext db)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
// default to /graphql endpoint
endpoints.MapGraphQL<DemoContext>();
});
}
}
This sets up 1 end point:
POST
at/graphql
where the body of the post is a GraphQL query- You can authorize that route how you would any ASP.NET route. See Authorization below for details on having parts of the schema requiring Authorization/Claims
Note - As of version 1.1+ the EntityGraphQL.AspNet extension helper uses System.Text.Json. Previous versions used JSON.NET.
3. Build awesome applications
You can now make a request to your API. For example
POST localhost:5000/graphql
{
properties { id name }
}
Will return the following result.
{
"data": {
"properties": [
{
"id": 11,
"name": "My Beach Pad"
},
{
"id": 12,
"name": "My Other Beach Pad"
}
]
}
}
Maybe you only want a specific property
{
property(id: 11) {
id name
}
}
Will return the following result.
{
"data": {
"property": {
"id": 11,
"name": "My Beach Pad"
}
}
}
If you need a deeper graph or relations, just ask
{
properties {
id
name
location {
name
}
type {
premium
}
}
}
Will return the following result.
{
"data": {
"properties": [
{
"id": 11,
"name": "My Beach Pad",
"location": {
"name": "Greece"
},
"type": {
"premium": 1.2
}
},
{
"id": 12,
"name": "My Other Beach Pad",
"location": {
"name": "Spain"
},
"type": {
"premium": 1.25
}
}
]
}
}
Visit documentation for more information.
Using expressions else where (EQL)
Lets say you have a screen in your application listing properties that can be configured per customer or user to only show exactly what they are interested in. Instead of having a bunch of checkboxes and complex radio buttons etc. you can allow a simple EQL statement to configure the results shown. Or use those UI components to build the query.
// This might be a configured EQL statement for filtering the results. It has a context of Property
(type.id = 2) or (type.id = 3) and type.name = "Farm"
This would compile to (Property p) => (p.Type.Id == 2 || p.Type.Id == 3) && p.Type.Name == "Farm";
This can then be used in various Linq functions either in memory or against an ORM.
// we create a schema provider to compile the statement against our Property type
var schemaProvider = SchemaBuilder.FromObject<Property>();
var compiledResult = EntityQueryCompiler.Compile(myConfigurationEqlStatement, schemaProvider);
// you get your list of Properties from you DB
var thingsToShow = myProperties.Where(compiledResult.LambdaExpression);
Another example is you want a customised calculated field. You can execute a compiled result passing in an instance of the context type.
// You'd take this from some configuration
var eql = @"if location.name = ""Mars"" then (cost + 5) * type.premium else (cost * type.premium) / 3"
var compiledResult = EntityQueryCompiler.Compile(eql, schemaProvider);
var theRealPrice = compiledResult.Execute<decimal>(myPropertyInstance);
Contribute & Join the Development
Please do. Pull requests are very welcome. See the open issues for bugs or features that would be useful.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.1 is compatible. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
- Antlr4 (>= 4.6.6)
- Antlr4.Runtime (>= 4.6.6)
- HotChocolate.Language (>= 11.3.5)
- Humanizer.Core (>= 2.11.10)
- Microsoft.CSharp (>= 4.7.0)
- Microsoft.Extensions.DependencyInjection (>= 5.0.2)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 5.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 5.0.0)
- Newtonsoft.Json (>= 13.0.1)
- System.ComponentModel.Annotations (>= 5.0.0)
- System.Reflection.Emit (>= 4.7.0)
- System.Reflection.TypeExtensions (>= 4.7.0)
- System.Text.Json (>= 6.0.0)
NuGet packages (3)
Showing the top 3 NuGet packages that depend on EntityGraphQL:
Package | Downloads |
---|---|
EntityGraphQL.AspNet
Contains ASP.NET extensions and middleware for EntityGraphQL |
|
Zen.Web.GraphQL
Package Description |
|
SiteCauldron.GenericAPI
SiteCauldron Generic API utilities for Web MVC applications. Provides a few controllers to cover most use cases, so that you mostly won't have to program a CRUD again. |
GitHub repositories (1)
Showing the top 1 popular GitHub repositories that depend on EntityGraphQL:
Repository | Stars |
---|---|
SapiensAnatis/Dawnshard
Server emulator for Dragalia Lost
|
Version | Downloads | Last updated |
---|---|---|
5.5.3 | 2,744 | 11/24/2024 |
5.5.2 | 845 | 11/15/2024 |
5.5.1 | 103 | 11/14/2024 |
5.5.0 | 965 | 10/25/2024 |
5.4.6 | 5,528 | 9/23/2024 |
5.4.5 | 887 | 9/13/2024 |
5.4.4 | 166 | 9/12/2024 |
5.4.3 | 1,627 | 9/3/2024 |
5.4.2 | 224 | 9/2/2024 |
5.4.1 | 8,115 | 7/15/2024 |
5.4.0 | 4,623 | 6/2/2024 |
5.3.0 | 5,384 | 5/7/2024 |
5.2.1 | 4,334 | 4/8/2024 |
5.2.0 | 5,284 | 3/19/2024 |
5.2.0-beta2 | 634 | 2/11/2024 |
5.2.0-beta1 | 3,043 | 11/16/2023 |
5.1.1 | 11,751 | 1/24/2024 |
5.1.0 | 7,191 | 11/16/2023 |
5.0.1 | 5,132 | 9/28/2023 |
5.0.0 | 3,081 | 8/2/2023 |
5.0.0-beta1 | 869 | 6/17/2023 |
4.3.1 | 532 | 11/22/2023 |
4.3.0 | 7,304 | 3/14/2023 |
4.2.1 | 13,636 | 12/22/2022 |
4.2.0 | 5,883 | 11/16/2022 |
4.1.2 | 2,040 | 10/20/2022 |
4.1.1 | 1,399 | 10/18/2022 |
4.1.0 | 1,347 | 10/13/2022 |
4.0.1 | 1,747 | 10/5/2022 |
4.0.0 | 2,382 | 9/10/2022 |
4.0.0-beta2 | 1,193 | 9/8/2022 |
4.0.0-beta1 | 787 | 9/6/2022 |
3.0.5 | 1,676 | 8/16/2022 |
3.0.4 | 1,342 | 8/5/2022 |
3.0.3 | 1,774 | 8/4/2022 |
3.0.2 | 1,487 | 8/1/2022 |
3.0.1 | 1,216 | 8/1/2022 |
3.0.0 | 1,350 | 7/31/2022 |
2.3.2 | 1,491 | 7/18/2022 |
2.3.1 | 1,662 | 7/14/2022 |
2.3.0 | 1,565 | 7/4/2022 |
2.2.0 | 3,382 | 7/1/2022 |
2.1.5 | 3,190 | 6/13/2022 |
2.1.4 | 1,240 | 6/11/2022 |
2.1.3 | 1,798 | 6/6/2022 |
2.1.2 | 1,360 | 5/23/2022 |
2.1.1 | 1,579 | 5/18/2022 |
2.1.0 | 1,245 | 5/17/2022 |
2.0.3 | 1,251 | 5/9/2022 |
2.0.2 | 1,335 | 5/6/2022 |
2.0.1 | 1,247 | 5/5/2022 |
2.0.0 | 1,343 | 4/29/2022 |
2.0.0-beta7 | 706 | 4/27/2022 |
2.0.0-beta6 | 700 | 4/25/2022 |
2.0.0-beta5 | 2,147 | 4/14/2022 |
2.0.0-beta4 | 803 | 4/13/2022 |
2.0.0-beta3 | 758 | 4/13/2022 |
2.0.0-beta2 | 798 | 4/11/2022 |
2.0.0-beta1 | 6,124 | 4/7/2022 |
1.2.0 | 17,956 | 2/15/2022 |
1.1.2 | 1,287 | 2/11/2022 |
1.1.1 | 1,352 | 2/9/2022 |
1.1.0 | 2,705 | 1/13/2022 |
1.1.0-beta2 | 742 | 1/8/2022 |
1.1.0-beta1 | 720 | 1/8/2022 |
1.0.3 | 839 | 12/28/2021 |
1.0.2 | 8,097 | 10/20/2021 |
1.0.1 | 13,610 | 9/30/2021 |
1.0.0 | 1,102 | 9/28/2021 |
1.0.0-beta2 | 815 | 9/15/2021 |
1.0.0-beta1 | 763 | 9/13/2021 |
0.70.0 | 3,876 | 8/30/2021 |
0.69.0 | 1,427 | 8/18/2021 |
0.69.0-beta7 | 783 | 8/12/2021 |
0.69.0-beta6 | 815 | 8/10/2021 |
0.69.0-beta5 | 768 | 8/9/2021 |
0.69.0-beta4 | 818 | 8/6/2021 |
0.69.0-beta3 | 805 | 8/5/2021 |
0.69.0-beta2 | 1,424 | 7/24/2021 |
0.69.0-beta1 | 860 | 7/16/2021 |
0.68.1 | 2,276 | 4/5/2021 |
0.66.1 | 13,761 | 10/5/2020 |
0.66.0 | 1,314 | 9/22/2020 |
0.65.0 | 1,145 | 9/17/2020 |
0.64.0 | 1,720 | 9/1/2020 |
0.63.0 | 1,836 | 6/10/2020 |
0.63.0-beta3 | 1,936 | 6/4/2020 |
0.63.0-beta2 | 943 | 6/4/2020 |
0.63.0-beta1 | 962 | 6/3/2020 |
0.62.0 | 1,249 | 5/27/2020 |
0.61.0 | 1,153 | 5/14/2020 |
0.60.0 | 1,161 | 5/9/2020 |
0.60.0-beta3 | 1,297 | 5/4/2020 |
0.60.0-beta1 | 1,184 | 4/22/2020 |
0.50.0 | 3,955 | 4/1/2020 |
0.50.0-beta1 | 1,027 | 3/24/2020 |
0.40.0 | 1,337 | 3/19/2020 |
0.32.1 | 1,707 | 3/3/2020 |
0.32.0 | 1,763 | 2/14/2020 |
0.31.0 | 1,515 | 2/6/2020 |
0.30.0 | 2,341 | 1/23/2020 |
0.29.0 | 1,179 | 1/21/2020 |
0.28.1 | 1,557 | 1/8/2020 |
0.28.0 | 1,308 | 1/8/2020 |
0.27.2 | 1,173 | 1/8/2020 |
0.27.1 | 1,189 | 1/7/2020 |
0.27.0 | 1,198 | 1/6/2020 |
0.26.0 | 5,029 | 1/2/2020 |
0.25.0 | 1,855 | 11/19/2019 |
0.24.0 | 1,236 | 11/12/2019 |
0.23.3 | 1,257 | 11/4/2019 |
0.23.2 | 1,242 | 11/2/2019 |
0.23.1 | 1,225 | 10/31/2019 |
0.23.0 | 1,196 | 10/30/2019 |
0.22.0 | 1,212 | 10/30/2019 |
0.21.0 | 2,506 | 9/3/2019 |
0.20.1 | 1,256 | 8/28/2019 |
0.20.0 | 1,205 | 8/28/2019 |
0.19.1 | 1,315 | 8/26/2019 |
0.19.0 | 1,215 | 8/25/2019 |
0.18.4 | 1,353 | 8/19/2019 |
0.18.3 | 1,380 | 7/30/2019 |
0.18.2 | 1,474 | 7/26/2019 |
0.18.1 | 1,334 | 7/18/2019 |
0.18.0 | 1,351 | 7/17/2019 |
0.17.0 | 1,517 | 7/8/2019 |
0.16.2 | 1,795 | 6/1/2019 |
0.16.1 | 1,378 | 5/27/2019 |
0.16.0 | 1,436 | 5/21/2019 |
0.15.8 | 1,512 | 4/11/2019 |
0.15.7 | 1,346 | 4/11/2019 |
0.15.6 | 10,491 | 3/15/2019 |
0.15.5 | 1,322 | 3/14/2019 |
0.15.4 | 1,355 | 3/8/2019 |
0.15.3 | 1,356 | 3/6/2019 |
0.15.2 | 1,377 | 2/22/2019 |
0.15.1 | 1,645 | 2/14/2019 |
0.15.0 | 1,474 | 2/5/2019 |
0.14.4 | 1,507 | 1/29/2019 |
0.14.3 | 1,454 | 1/25/2019 |
0.14.2 | 1,406 | 1/22/2019 |
0.14.1 | 1,429 | 1/21/2019 |
0.14.0 | 1,489 | 1/14/2019 |
0.13.1 | 1,457 | 1/9/2019 |
0.13.0 | 1,442 | 1/3/2019 |
0.12.1 | 1,535 | 12/18/2018 |
0.12.0 | 1,413 | 12/13/2018 |
0.11.0 | 1,520 | 11/13/2018 |