DbConnectionExtensions

Classes > DataProvider > DbConnectionExtensions

Static extension methods for IDbConnection following FP patterns. All methods return Result types for explicit error handling.

public static class DbConnectionExtensions

Example

using var connection = new SqliteConnection("Data Source=mydb.db");
connection.Open();

// Execute a query with mapping
var result = connection.Query<Customer>(
    sql: "SELECT Id, Name FROM Customers WHERE Active = 1",
    mapper: reader => new Customer(
        Id: reader.GetInt32(0),
        Name: reader.GetString(1)
    )
);

// Pattern match on the result
var customers = result switch
{
    Result<IReadOnlyList<Customer>, SqlError>.Ok<IReadOnlyList<Customer>, SqlError> ok => ok.Value,
    Result<IReadOnlyList<Customer>, SqlError>.Error<IReadOnlyList<Customer>, SqlError> err => throw new Exception(err.Value.Message),
    _ => throw new InvalidOperationException()
};

Methods

Query<T>(IDbConnection, string, IEnumerable<IDataParameter>?, Func<IDataReader, T>?)

public static Result<IReadOnlyList<T>, SqlError> Query<T>(this IDbConnection connection, string sql, IEnumerable<IDataParameter>? parameters = null, Func<IDataReader, T>? mapper = null)

Execute a query and return results.

Parameters:

Name Type Description
connection IDbConnection The database connection
sql String The SQL query
parameters IDataParameter> Optional parameters
mapper IDataReader,<T>> Function to map from IDataReader to T

Returns: SqlError> - Result with list of T or error

Example

var result = connection.Query<Product>(
    sql: "SELECT * FROM Products WHERE Price > @minPrice",
    parameters: [new SqliteParameter("@minPrice", 10.00)],
    mapper: r => new Product(r.GetInt32(0), r.GetString(1), r.GetDecimal(2))
);

Execute(IDbConnection, string, IEnumerable<IDataParameter>?)

public static Result<int, SqlError> Execute(this IDbConnection connection, string sql, IEnumerable<IDataParameter>? parameters = null)

Execute a non-query command (INSERT, UPDATE, DELETE).

Parameters:

Name Type Description
connection IDbConnection The database connection
sql String The SQL command
parameters IDataParameter> Optional parameters

Returns: SqlError> - Result with rows affected or error

Example

var result = connection.Execute(
    sql: "UPDATE Products SET Price = @price WHERE Id = @id",
    parameters: [
        new SqliteParameter("@price", 19.99),
        new SqliteParameter("@id", 42)
    ]
);

if (result is Result<int, SqlError>.Ok<int, SqlError> ok)
    Console.WriteLine($"Updated {ok.Value} rows");

Scalar<T>(IDbConnection, string, IEnumerable<IDataParameter>?)

public static Result<T?, SqlError> Scalar<T>(this IDbConnection connection, string sql, IEnumerable<IDataParameter>? parameters = null)

Execute a scalar command

Parameters:

Name Type Description
connection IDbConnection The database connection
sql String The SQL command
parameters IDataParameter> Optional parameters

Returns: SqlError> - Result with scalar value or error

GetRecords<T>(IDbConnection, SelectStatement, Func<SelectStatement, Result<string, SqlError>>, Func<IDataReader, T>, IEnumerable<IDataParameter>?)

public static Result<IReadOnlyList<T>, SqlError> GetRecords<T>(this IDbConnection connection, SelectStatement statement, Func<SelectStatement, Result<string, SqlError>> sqlGenerator, Func<IDataReader, T> mapper, IEnumerable<IDataParameter>? parameters = null)

Execute a SelectStatement by generating platform-specific SQL and mapping results.

Parameters:

Name Type Description
connection IDbConnection The database connection
statement SelectStatement The abstract SQL statement
sqlGenerator SqlError>> Function that converts the statement to platform-specific SQL (returns Result)
mapper IDataReader,<T>> Mapper from IDataReader to T (required)
parameters IDataParameter> Optional parameters to pass to the command

Returns: SqlError> - Result with list of T or SqlError on failure