Commands and queries
Jerrycurl relies heavily on the command-query separation pattern, which ensures that your data-writing code is separated from your data-reading code.
-
Create relational input data from an object source, simulating
SELECT
. -
Execute an SQL query or command referencing the input (i.e. parameters),
outputting a number of
IDataReader
data sets. -
Map output data back into your relational model by simulating
INSERT
(queries) andUPDATE
(commands) operations.
// command
var command = connection.CreateCommand();
command.CommandText = "INSERT INTO ...";
// query
var query = connection.CreateCommand();
command.CommandText = "SELECT ... FROM";
Parameters
store.From(new Blog() { ... })
.Select("Title", "CreatedOn")
.AddParameters(command);
store.From(new BlogFilter() { ... })
.Select("MinDate", "MaxDate")
.AddParameters(query);
Queries
// query
var query = connection.CreateCommand();
query.CommandText = @"SELECT [Title] AS [Item.Title]
FROM [Blog]
WHERE CreatedOn BETWEEN @P0 AND @P1";
// parameters
var data = new BlogFilter { ... };
store.From(data)
.Select("MinDate", "MaxDate")
.AddParameters(query);
// buffer
var schema = store.GetSchema<List<Blog>>();
var buffer = new QueryBuffer(schema, QueryType.List);
buffer.Insert(dataReader);
var result = buffer.Commit<List<Blog>>();
Connections
var options = new QueryOptions
{
ConnectionFactory = () => new SqlConnection("..."),
Schemas = store,
};
var query = new Query
{
QueryText = "SELECT ... FROM",
Parameters = store.From(new BlogFilter() { ... })
.Select("MinDate", "MaxDate")
.AsParameters()
};
var engine = new QueryEngine(options);
var result = engine.List<Blog>(query);
Commands
// command data
var data = new Blog { ... };
store.From(data)
.Select("Title", "CreatedOn")
.AddParameters(command);
var buffer = new CommandBuffer();
using var dataReader = command.ExecuteReader();
buffer.UpdateAll(dataReader);
buffer.Commit();
Parameters
Bindings
Jerrycurl has three methods that can be used to get data back into your object:
-
A
ParameterBinding
works by setting theIDataParameter.Direction
to output -
A
ColumnBinding
-
A
CascadeBinding
Connections
var options = new CommandOptions
{
ConnectionFactory = () => new SqlConnection("..."),
};
var data = new Blog() { ... };
var command = new Command
{
CommandText = "INSERT INTO ...",
Parameters = store.From(data)
.Select("Title", "CreatedOn")
.AsParameters(),
Bindings = store.From(data)
.Select("Id")
.AsBindings(),
};
var engine = new CommandEngine(options);
engine.Execute(command);