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) and UPDATE (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 the IDataParameter.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);