Я написал первый Dapper.Contrib давным-давно после некоторого разговора с Сэмом. Я не знаю деталей пакета Extensions, и они, кажется, более или менее выполняют ту же самую задачу CRUD, но пакет Contrib может быть несколько быстрее в некоторых сценариях, поскольку он имеет встроенный кэш для запросов и интерфейса POCO на основе внутреннего "грязного" отслеживания. Снято с тест-кода:
using (var connection = GetOpenConnection())
{
connection.Get<User>(3).IsNull();
var id = connection.Insert(new User {Name = "Adam", Age = 10});
//get a user with "isdirty" tracking
var user = connection.Get<IUser>(id);
user.Name.IsEqualTo("Adam");
connection.Update(user).IsEqualTo(false); //returns false if not updated, based on tracking
user.Name = "Bob";
connection.Update(user).IsEqualTo(true); //returns true if updated, based on tracking
user = connection.Get<IUser>(id);
user.Name.IsEqualTo("Bob");
//get a user with no tracking
var notrackedUser = connection.Get<User>(id);
notrackedUser.Name.IsEqualTo("Bob");
connection.Update(notrackedUser).IsEqualTo(true); //returns true, even though user was not changed
notrackedUser.Name = "Cecil";
connection.Update(notrackedUser).IsEqualTo(true);
connection.Get<User>(id).Name.IsEqualTo("Cecil");
connection.Query<User>("select * from Users").Count().IsEqualTo(1);
connection.Delete(user).IsEqualTo(true);
connection.Query<User>("select * from Users").Count().IsEqualTo(0);
connection.Update(notrackedUser).IsEqualTo(false); //returns false, user not found
Contrib не имеет привлекательной системы предикатов, которую имеет Extensions. ПРИМЕЧАНИЕ есть хорошая тема на Dapper.Contrib здесь Dapper.Rainbow VS Dapper.Contrib