Configure Data Source NReco.GraphQL documentation
GraphQL API's configuration takes place in two stages.
The first stage is configuring DbAdapter to your database (this is component from NReco.Data open-source lib).
// configure ADO.NET and NReco.Data components for SQL Server
var dbFactory = new DbFactory(System.Data.SqlClient.SqlClientFactory.Instance) {
LastInsertIdSelectText = "SELECT @@IDENTITY"
};
var dbConnection = dbFactory.CreateConnection();
dbConnection.ConnectionString = "Data Source=mssql.customers.com,1433;Database=dbo.customers;User=graphqlUser;Password=user1;";
var dbCmdBuilder = new DbCommandBuilder(dbFactory);
dbCmdBuilder.SelectTemplate = "SELECT @columns FROM @table @where[ WHERE {0}] @orderby[ ORDER BY {0}; ORDER BY (SELECT NULL)] @recordoffset[OFFSET {0} ROWS;OFFSET 0 ROWS] @recordcount[FETCH NEXT {0} ROWS ONLY]";
dbAdapter = new DbDataAdapter(dbConnection, dbCmdBuilder);
//Pagination: gets or sets flag that determines whether query record offset is applied during reading query results.
dbAdapter.ApplyOffset = false;
If you use legacy version of SQL Server that doesn't support OFFSET/FETCH NEXT or if this syntax is not applicable you can switch to TOP-based SQL template:
dbCmdBuilder.SelectTemplate = "SELECT @recordtop[TOP {0}] @columns FROM @table @where[ WHERE {0}] @orderby[ ORDER BY {0}]";
dbAdapter.ApplyOffset = true; // skip first N rows by cursor move
// configure ADO.NET and NReco.Data components
var dbFactory = new DbFactory(MySql.Data.MySqlClient.MySqlClientFactory.Instance) {
LastInsertIdSelectText = "SELECT LAST_INSERT_ID()"
};
var dbConnection = dbFactory.CreateConnection();
dbConnection.ConnectionString = "Server=mysql.net;Database=nreco_graphql;Uid=mysqluser;Pwd=password;";
var dbCmdBuilder = new DbCommandBuilder(dbFactory);
dbCmdBuilder.SelectTemplate = "SELECT @columns FROM @table@where[ WHERE {0}]@orderby[ ORDER BY {0}] @recordcount[LIMIT {0}] @recordoffset[OFFSET {0}]";
dbAdapter = new DbDataAdapter(dbConnection, dbCmdBuilder);
//Pagination: gets or sets flag that determines whether query record offset is applied during reading query results.
dbAdapter.ApplyOffset = false;
// configure ADO.NET and NReco.Data components
var dbFactory = new DbFactory(Microsoft.Data.Sqlite.SqliteFactory.Instance) {
LastInsertIdSelectText = "SELECT last_insert_rowid()"
};
var dbConnection = dbFactory.CreateConnection();
dbConnection.ConnectionString = "Filename=northwind.db";
var dbCmdBuilder = new DbCommandBuilder(dbFactory);
dbCmdBuilder.SelectTemplate = "SELECT @columns FROM @table@where[ WHERE {0}]@orderby[ ORDER BY {0}] @recordcount[LIMIT {0}] @recordoffset[OFFSET {0}]";
dbAdapter = new DbDataAdapter(dbConnection, dbCmdBuilder);
//Pagination: gets or sets flag that determines whether query record offset is applied during reading query results.
dbAdapter.ApplyOffset = false;
Second stage is defining Schema based on json configuration file (see example of "metaDbData.json" below):
var graphqlAdapter = new GraphqlDbAdapter( dbAdapter, JsonConvert.DeserializeObject<GraphqlConfiguration>( System.IO.File.ReadAllText(Path.Combine(ApplicationPath, "metaDbData.json")) ) );
or in code:
var graphqlConfiguration = new GraphqlConfiguration();
graphqlConfiguration.SchemaObjects = new ObjectSchema[] {
new ObjectSchema {
SingleName = "customer",
ListName = "customers",
Table = "db.customers",
Fields = new FieldSchema[] {
new FieldSchema {
Name = "id",
Column = "ID",
DataType = TypeCode.Int32
},
new FieldSchema {
Name = "name",
DataType = TypeCode.String
}
}
};
var graphqlAdapter = new GraphqlDbAdapter(dbAdapter, graphqlConfiguration);
Configuration JSON example
{
"Options": {
"Pagination": {
"ArgumentNameForFirst": "limitItems"
}
},
"SchemaObjects": [
{
"SingleName": "customer",
"ListName": "customers",
"Table": "Customers",
"Description": "Customer table - contains data about customer",
"Fields": [
{
"Name": "id",
"Column": "CustomerID",
"DataType": "string",
"Description": "Unique identificator - using also to connect with orders"
},
{
"Name": "name",
"DataType": "string"
}
],
"RelatedObjects": [
{
"Name": "order", // refers to the name of related object
"Relex": "orders(CustomerID=\"id\":var)[*]" // query used to load related object
},
{
"Name": "orders",
"Relex": "orders(CustomerID=\"id\":var)[*]"
}
]
},
{
"SingleName": "order",
"ListName": "orders",
"Table": "Orders",
"Fields": [
{
"Name": "orderId",
"Column": "OrderID",
"DataType": "int32"
},
{
"Name": "customerId",
"Column": "CustomerID",
"DataType": "string"
},
{
"Name": "ShipName",
"DataType": "string"
}
]
}
]
}
| Json schema option | Purpose |
|---|---|
| Options/Pagination | Options for pagination options in GraphQL queries. |
| SchemaObjects | Defines Graphql object schema and how it is mapped to SQL. |
| SchemaObjects/RelatedObjects |
Defines a relation to another Graphql object where "id":var refers to id column from parent object.
Also you can use constants, for example: orders(CustomerID=\"id\":var AND ShipName=\"USS Enterprise\")[*].
Complete reference on the syntax: https://github.com/nreco/data/wiki/Relex
|