EntityGraphQL 2.0.0-beta1

This is a prerelease version of EntityGraphQL.
There is a newer version of this package available.
See the version list below for details.
dotnet add package EntityGraphQL --version 2.0.0-beta1                
NuGet\Install-Package EntityGraphQL -Version 2.0.0-beta1                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="EntityGraphQL" Version="2.0.0-beta1" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add EntityGraphQL --version 2.0.0-beta1                
#r "nuget: EntityGraphQL, 2.0.0-beta1"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install EntityGraphQL as a Cake Addin
#addin nuget:?package=EntityGraphQL&version=2.0.0-beta1&prerelease

// Install EntityGraphQL as a Cake Tool
#tool nuget:?package=EntityGraphQL&version=2.0.0-beta1&prerelease                

Entity GraphQL

A GraphQL library for .NET Core

Build Nuget

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

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.

Nuget

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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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.2 337 11/15/2024
5.5.1 87 11/14/2024
5.5.0 695 10/25/2024
5.4.6 3,777 9/23/2024
5.4.5 879 9/13/2024
5.4.4 155 9/12/2024
5.4.3 1,546 9/3/2024
5.4.2 203 9/2/2024
5.4.1 7,355 7/15/2024
5.4.0 3,969 6/2/2024
5.3.0 4,596 5/7/2024
5.2.1 4,192 4/8/2024
5.2.0 4,999 3/19/2024
5.2.0-beta2 627 2/11/2024
5.2.0-beta1 2,789 11/16/2023
5.1.1 11,636 1/24/2024
5.1.0 6,837 11/16/2023
5.0.1 4,975 9/28/2023
5.0.0 3,074 8/2/2023
5.0.0-beta1 866 6/17/2023
4.3.1 521 11/22/2023
4.3.0 7,231 3/14/2023
4.2.1 13,601 12/22/2022
4.2.0 5,878 11/16/2022
4.1.2 2,035 10/20/2022
4.1.1 1,394 10/18/2022
4.1.0 1,342 10/13/2022
4.0.1 1,740 10/5/2022
4.0.0 2,377 9/10/2022
4.0.0-beta2 1,190 9/8/2022
4.0.0-beta1 785 9/6/2022
3.0.5 1,669 8/16/2022
3.0.4 1,335 8/5/2022
3.0.3 1,769 8/4/2022
3.0.2 1,482 8/1/2022
3.0.1 1,211 8/1/2022
3.0.0 1,345 7/31/2022
2.3.2 1,487 7/18/2022
2.3.1 1,657 7/14/2022
2.3.0 1,560 7/4/2022
2.2.0 3,377 7/1/2022
2.1.5 3,153 6/13/2022
2.1.4 1,235 6/11/2022
2.1.3 1,793 6/6/2022
2.1.2 1,354 5/23/2022
2.1.1 1,574 5/18/2022
2.1.0 1,240 5/17/2022
2.0.3 1,246 5/9/2022
2.0.2 1,330 5/6/2022
2.0.1 1,242 5/5/2022
2.0.0 1,339 4/29/2022
2.0.0-beta7 703 4/27/2022
2.0.0-beta6 695 4/25/2022
2.0.0-beta5 2,144 4/14/2022
2.0.0-beta4 800 4/13/2022
2.0.0-beta3 755 4/13/2022
2.0.0-beta2 795 4/11/2022
2.0.0-beta1 6,121 4/7/2022
1.2.0 17,768 2/15/2022
1.1.2 1,282 2/11/2022
1.1.1 1,347 2/9/2022
1.1.0 2,692 1/13/2022
1.1.0-beta2 739 1/8/2022
1.1.0-beta1 717 1/8/2022
1.0.3 834 12/28/2021
1.0.2 8,092 10/20/2021
1.0.1 13,605 9/30/2021
1.0.0 1,095 9/28/2021
1.0.0-beta2 812 9/15/2021
1.0.0-beta1 760 9/13/2021
0.70.0 3,871 8/30/2021
0.69.0 1,404 8/18/2021
0.69.0-beta7 780 8/12/2021
0.69.0-beta6 812 8/10/2021
0.69.0-beta5 765 8/9/2021
0.69.0-beta4 815 8/6/2021
0.69.0-beta3 802 8/5/2021
0.69.0-beta2 1,421 7/24/2021
0.69.0-beta1 857 7/16/2021
0.68.1 2,267 4/5/2021
0.66.1 13,747 10/5/2020
0.66.0 1,309 9/22/2020
0.65.0 1,140 9/17/2020
0.64.0 1,715 9/1/2020
0.63.0 1,829 6/10/2020
0.63.0-beta3 1,931 6/4/2020
0.63.0-beta2 940 6/4/2020
0.63.0-beta1 957 6/3/2020
0.62.0 1,242 5/27/2020
0.61.0 1,146 5/14/2020
0.60.0 1,154 5/9/2020
0.60.0-beta3 1,294 5/4/2020
0.60.0-beta1 1,181 4/22/2020
0.50.0 3,942 4/1/2020
0.50.0-beta1 1,024 3/24/2020
0.40.0 1,331 3/19/2020
0.32.1 1,700 3/3/2020
0.32.0 1,756 2/14/2020
0.31.0 1,508 2/6/2020
0.30.0 2,334 1/23/2020
0.29.0 1,172 1/21/2020
0.28.1 1,550 1/8/2020
0.28.0 1,301 1/8/2020
0.27.2 1,166 1/8/2020
0.27.1 1,182 1/7/2020
0.27.0 1,191 1/6/2020
0.26.0 5,022 1/2/2020
0.25.0 1,846 11/19/2019
0.24.0 1,229 11/12/2019
0.23.3 1,250 11/4/2019
0.23.2 1,235 11/2/2019
0.23.1 1,218 10/31/2019
0.23.0 1,189 10/30/2019
0.22.0 1,205 10/30/2019
0.21.0 2,499 9/3/2019
0.20.1 1,249 8/28/2019
0.20.0 1,198 8/28/2019
0.19.1 1,308 8/26/2019
0.19.0 1,208 8/25/2019
0.18.4 1,346 8/19/2019
0.18.3 1,373 7/30/2019
0.18.2 1,467 7/26/2019
0.18.1 1,327 7/18/2019
0.18.0 1,344 7/17/2019
0.17.0 1,510 7/8/2019
0.16.2 1,788 6/1/2019
0.16.1 1,371 5/27/2019
0.16.0 1,428 5/21/2019
0.15.8 1,503 4/11/2019
0.15.7 1,339 4/11/2019
0.15.6 10,484 3/15/2019
0.15.5 1,315 3/14/2019
0.15.4 1,349 3/8/2019
0.15.3 1,348 3/6/2019
0.15.2 1,368 2/22/2019
0.15.1 1,638 2/14/2019
0.15.0 1,465 2/5/2019
0.14.4 1,499 1/29/2019
0.14.3 1,447 1/25/2019
0.14.2 1,400 1/22/2019
0.14.1 1,422 1/21/2019
0.14.0 1,482 1/14/2019
0.13.1 1,450 1/9/2019
0.13.0 1,435 1/3/2019
0.12.1 1,529 12/18/2018
0.12.0 1,406 12/13/2018
0.11.0 1,504 11/13/2018