Get Started for PostgreSQL
RepoDB is a hybrid .NET ORM library for PostgreSQL RDBMS. The project is hosted at Github and is licensed with Apache 2.0.
Support ships as two packages:
- RepoDb.PostgreSql — the core provider, built on Npgsql.
- RepoDb.PostgreSql.BulkOperations — adds
BulkInsert,BulkMerge,BulkUpdateandBulkDelete.
Installation
Install the library via NuGet using the Package Manager Console.
> Install-Package RepoDb.PostgreSql
To use bulk operations (BulkDelete, BulkInsert, BulkMerge and BulkUpdate), install the RepoDb.PostgreSql.BulkOperations package.
> Install-Package RepoDb.PostgreSql.BulkOperations
After installation, call the globalized setup method to initialize all dependencies for PostgreSql.
GlobalConfiguration
.Setup()
.UsePostgreSql();
Create a Table
The examples below assume the following table exists in the database.
CREATE TABLE IF NOT EXISTS "Person"
(
"Id" bigint(20) NOT NULL AUTO_INCREMENT,
"Name" text,
"Age" int(11) DEFAULT NULL,
"CreatedDateUtc" datetime DEFAULT NULL
);
Create a Model
The examples below assume the following model exists in the application.
public class Person
{
public long Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public DateTime CreatedDateUtc { get; set; }
}
Creating a Record
To insert a row, use the Insert method.
var person = new Person
{
Name = "John Doe",
Age = 54,
CreatedDateUtc = DateTime.UtcNow
};
using (var connection = new NpgsqlConnection(ConnectionString))
{
var id = connection.Insert(person);
}
To insert multiple rows, use the InsertAll operation.
var people = GetPeople(100);
using (var connection = new NpgsqlConnection(ConnectionString))
{
var rowsInserted = connection.InsertAll(people);
}
The Insert method returns the value of identity/primary column, while the InsertAll method returns the number of rows inserted. Both methods are automatically setting back the value of identity/primary property to the entity model (if present).
Querying a Record
To query a row, use the Query method.
using (var connection = new NpgsqlConnection(ConnectionString))
{
var person = connection.Query<Person>(e => e.Id == 1);
/* Process the result here */
}
To query all rows, use the QueryAll method.
using (var connection = new NpgsqlConnection(ConnectionString))
{
var people = connection.QueryAll<Person>();
/* Process the results here */
}
Merging a Record
To merge a row, use the Merge method.
var person = new Person
{
Id = 1,
Name = "John Doe",
Age = 57,
CreatedDateUtc = DateTime.UtcNow
};
using (var connection = new NpgsqlConnection(ConnectionString))
{
var id = connection.Merge(person);
}
By default, the primary column is used as a qualifier. Custom qualifiers can also be specified.
var person = new Person
{
Name = "John Doe",
Age = 57,
CreatedDateUtc = DateTime.UtcNow
};
using (var connection = new NpgsqlConnection(ConnectionString))
{
var id = connection.Merge(person, qualifiers: (p => new { p.Name }));
}
To merge multiple rows, use the MergeAll method.
var people = GetPeople(100);
people
.AsList()
.ForEach(p => p.Name = $"{p.Name} (Merged)");
using (var connection = new NpgsqlConnection(ConnectionString))
{
var affectedRecords = connection.MergeAll<Person>(people);
}
The Merge method returns the identity/primary column value, while the MergeAll method returns the number of rows affected. Both methods are automatically setting back the value of identity/primary property if present.
Deleting a Record
To delete a row, use the Delete method.
using (var connection = new NpgsqlConnection(ConnectionString))
{
var deletedCount = connection.Delete<Person>(1);
}
Other columns can also be used as qualifiers.
using (var connection = new NpgsqlConnection(ConnectionString))
{
var deletedRows = connection.Delete<Person>(p => p.Name == "John Doe");
}
To delete all rows, use the DeleteAll method.
using (var connection = new NpgsqlConnection(ConnectionString))
{
var deletedRows = connection.DeleteAll<Person>();
}
A list of primary keys can also be passed for targeted deletion.
using (var connection = new NpgsqlConnection(connectionString))
{
var primaryKeys = new [] { 10045, 11001, ..., 12011 };
var deletedRows = connection.DeleteAll<Person>(primaryKeys);
}
Both the Delete and DeleteAll methods return the number of rows affected during the execution.
Updating a Record
To update a row, use the Update method.
var person = new Person
{
Id = 1,
Name = "James Doe",
Age = 55,
DateInsertedUtc = DateTime.UtcNow
};
using (var connection = new NpgsqlConnection(ConnectionString))
{
var updatedRows = connection.Update<Person>(person);
}
Specific columns can also be targeted using a dynamic update.
using (var connection = new NpgsqlConnection(ConnectionString))
{
var updatedRows = connection.Update("Person", new { Id = 1, Name = "James Doe" });
}
To update multiple rows, use the UpdateAll method.
var people = GetPeople(100);
people
.AsList()
.ForEach(p => p.Name = $"{p.Name} (Updated)");
using (var connection = new NpgsqlConnection(ConnectionString))
{
var updatedRows = connection.UpdateAll<Person>(people);
}
By default, the primary column is used as a qualifier. Custom qualifiers can also be specified.
var people = GetPeople(100);
people
.AsList()
.ForEach(p => p.Name = $"{p.Name} (Updated)");
using (var connection = new NpgsqlConnection(ConnectionString))
{
var updatedRows = connection.UpdateAll<Person>(people,
qualifiers: (p => new { p.Name }));
}
Both the Update and UpdateAll methods return the number of rows affected during the execution.
Executing a Query
To execute a non-query statement, use the ExecuteNonQuery method.
using (var connection = new NpgsqlConnection(ConnectionString))
{
var sql = "DELETE FROM \"Person\" WHERE \"Id\" = @Id;";
var affectedRecords = connection.ExecuteNonQuery(sql, new { Id = 1 });
}
To execute a query and return mapped objects, use the ExecuteQuery method.
using (var connection = new NpgsqlConnection(ConnectionString))
{
var sql = "SELECT * FROM \"Person\" ORDER BY \"Id\" ASC;";
var people = connection.ExecuteQuery<Person>(sql);
/* Process the results here */
}
To execute a query and return a scalar value, use the ExecuteScalar method.
using (var connection = new NpgsqlConnection(ConnectionString))
{
var sql = "SELECT MAX(\"Id\") FROM \"Person\";";
var maxId = connection.ExecuteQuery<Person>(sql);
}
To execute a query and return a DbDataReader, use the ExecuteReader method.
using (var connection = new NpgsqlConnection(ConnectionString))
{
var sql = "SELECT * FROM \"Person\" ORDER BY \"Id\" ASC;";
using (var reader = connection.ExecuteReader(sql))
{
/* Process the data reader here */
}
}
Executing a Stored Procedure
Call a PROCEDURE with CALL via the ExecuteNonQuery method.
using (var connection = new NpgsqlConnection(ConnectionString))
{
var affectedRecords = connection.ExecuteNonQuery("CALL sp_update_person(@Id, @Name);",
new { Id = 1, Name = "James Doe" });
}
Call a FUNCTION that returns rows with a SELECT * FROM wrapper via ExecuteQuery.
using (var connection = new NpgsqlConnection(ConnectionString))
{
var people = connection.ExecuteQuery<Person>("SELECT * FROM fn_get_people();");
}
CommandType.StoredProcedureis also supported by Npgsql for calling aFUNCTION— pass just the function name as the command text.PROCEDUREs (introduced in PostgreSQL 11) are always called withCALL, regardless of command type.
Typed Result Execution
Single-column result sets can be mapped to any .NET CLR type via ExecuteQuery.
using (var connection = new NpgsqlConnection(ConnectionString))
{
var sql = "SELECT \"Name\" FROM \"Person\";";
var names = connection.ExecuteQuery<string>(sql);
}
Enumeration types are also supported.
public enum Gender
{
Male,
Female
}
using (var connection = new NpgsqlConnection(ConnectionString))
{
var sql = "SELECT \"Gender\" FROM \"Person\";";
var genders = connection.ExecuteQuery<Gender>(sql);
}
The resultset of this operation is an IEnumerable object.