- Smart.Data.Mapper .NET is simplified micro-orm library, degradation version of Dapper.
- Main use is for environments that don't support code generation.
- Also support for environments that support code generation.
// Execute var effect = con.Execute("INSERT INTO Data (Id, Name, Code) VALUES (@Id, @Name, @Code)", new { Id = 1, Name = "test", Code = "A" }); // Execute scalar var count = con.ExecuteScalar<long>("SELECT COUNT(*) FROM Data WHERE Code = @Code", new { Code = "A" }); // Query list foreach (var entity in con.Query<Data>("SELECT * FROM Data ORDER BY Id")) { } // Query one var entity = con.QueryFirstOrDefault<Data>("SELECT COUNT(*) FROM Data WHERE Id = @Id", new { Id = 1 }); // Execute procedure public sealed class TestProcParameter { public int InParam { get; set; } [Direction(ParameterDirection.Output)] public long OutParam { get; set; } } var parameter = new TestProcParameter { InParam = 1 }; con.Execute("TestProc", parameter, commandType: CommandType.StoredProcedure); var result = parameter.OutParam;| Package |
|---|
int Execute(this IDbConnection con, ISqlMapperConfig config, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null) int Execute(this IDbConnection con, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null) async ValueTask<int> ExecuteAsync(this IDbConnection con, ISqlMapperConfig config, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null, CancellationToken token = default) Task<int> ExecuteAsync(this IDbConnection con, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null, CancellationToken token = default)T ExecuteScalar<T>(this IDbConnection con, ISqlMapperConfig config, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null) T ExecuteScalar<T>(this IDbConnection con, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null) async ValueTask<T> ExecuteScalarAsync<T>(this IDbConnection con, ISqlMapperConfig config, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null, CancellationToken token = default) Task<T> ExecuteScalarAsync<T>(this IDbConnection con, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null, CancellationToken token = default)IDataReader ExecuteReader(this IDbConnection con, ISqlMapperConfig config, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null, CommandBehavior commandBehavior = CommandBehavior.Default) IDataReader ExecuteReader(this IDbConnection con, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null, CommandBehavior commandBehavior = CommandBehavior.Default) async ValueTask<DbDataReader> ExecuteReaderAsync(this IDbConnection con, ISqlMapperConfig config, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null, CommandBehavior commandBehavior = CommandBehavior.Default, CancellationToken token = default) Task<DbDataReader> ExecuteReaderAsync(this IDbConnection con, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null, CommandBehavior commandBehavior = CommandBehavior.Default, CancellationToken token = default)IEnumerable<T> Query<T>(this IDbConnection con, ISqlMapperConfig config, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null) IEnumerable<T> Query<T>(this IDbConnection con, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null) async IAsyncEnumerable<T> QueryAsync<T>(this IDbConnection con, ISqlMapperConfig config, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null, CancellationToken cancel = default) IAsyncEnumerable<T> QueryAsync<T>(this IDbConnection con, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null, CancellationToken cancel = default)List<T> QueryList<T>(this IDbConnection con, ISqlMapperConfig config, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null) List<T> QueryList<T>(this IDbConnection con, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null) async ValueTask<List<T>> QueryListAsync<T>(this IDbConnection con, ISqlMapperConfig config, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null, CancellationToken cancel = default) Task<List<T>> QueryListAsync<T>(this IDbConnection con, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null, CancellationToken cancel = default)T QueryFirstOrDefault<T>(this IDbConnection con, ISqlMapperConfig config, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null) T QueryFirstOrDefault<T>(this IDbConnection con, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null) async ValueTask<T> QueryFirstOrDefaultAsync<T>(this IDbConnection con, ISqlMapperConfig config, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null, CancellationToken token = default) Task<T> QueryFirstOrDefaultAsync<T>(this IDbConnection con, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null, CancellationToken token = default)- Pascal and snake case support by default
- NameAttribute support
- IgnoreAttribute support
- DirectionAttribute support
- DbTypeAttribute support
- SizeAttribute support
- IgnoreAttribute support
- Like Dapper
- Like Dapper
// Reflection api abstraction IDelegateFactory DelegateFactory { get; set; } // Type converter IObjectConverter Converter { get; set; } // Mapping property selector IPropertySelector PropertySelector { get; set; }// Reset IParameterBuilderFactory's SqlMapperConfig ResetParameterBuilderFactories() // Supports DynamicParameter, IDictionary<string, object> and object by default SqlMapperConfig ConfigureBuilderFactory(Action<IList<IParameterBuilderFactory>> action) // Reset IResultMapperFactory's SqlMapperConfig ResetResultMappers() // Supports object by default SqlMapperConfig ConfigureMapperFactory(Action<IList<IResultMapperFactory>> action) // Reset type map SqlMapperConfig ResetTypeMap() // Configure type map SqlMapperConfig ConfigureTypeMap(Action<IDictionary<Type, DbType>> action) // Reset type handlers SqlMapperConfig ResetTypeHandlers() // Configure type handlers SqlMapperConfig ConfigureTypeHandlers(Action<IDictionary<Type, ITypeHandler>> action)- Multiple query support ?
Benchmark result on .NET Core 7 with Code generation mode.
BenchmarkDotNet v0.14.0, Windows 11 (10.0.26100.3194) AMD Ryzen 9 5900X, 1 CPU, 24 logical and 12 physical cores .NET SDK 9.0.200 [Host] : .NET 9.0.2 (9.0.225.6610), X64 RyuJIT AVX2 MediumRun : .NET 9.0.2 (9.0.225.6610), X64 RyuJIT AVX2 | Method | Mean | Error | StdDev | Min | Max | P90 | Gen0 | Gen1 | Allocated |
|---|---|---|---|---|---|---|---|---|---|
| DapperExecute | 212.58 ns | 4.694 ns | 7.026 ns | 202.33 ns | 229.03 ns | 222.42 ns | 0.0271 | - | 456 B |
| SmartExecute | 80.62 ns | 1.592 ns | 2.283 ns | 77.19 ns | 85.88 ns | 83.68 ns | 0.0220 | - | 368 B |
| DapperExecuteWithParameter10 | 483.89 ns | 9.340 ns | 13.093 ns | 466.67 ns | 518.24 ns | 502.96 ns | 0.0742 | - | 1256 B |
| SmartExecuteWithParameter10 | 264.96 ns | 4.597 ns | 6.593 ns | 253.83 ns | 278.68 ns | 273.28 ns | 0.0747 | - | 1256 B |
| DapperExecuteWithOverParameter | 207.20 ns | 12.270 ns | 18.365 ns | 181.00 ns | 238.40 ns | 231.96 ns | 0.0281 | - | 472 B |
| SmartExecuteWithOverParameter | 260.22 ns | 5.732 ns | 8.580 ns | 243.94 ns | 280.53 ns | 271.56 ns | 0.0747 | - | 1256 B |
| DapperExecuteScalar | 93.23 ns | 2.778 ns | 3.984 ns | 88.68 ns | 102.58 ns | 99.87 ns | 0.0085 | - | 144 B |
| SmartExecuteScalar | 43.67 ns | 0.866 ns | 1.214 ns | 42.35 ns | 46.85 ns | 45.33 ns | 0.0086 | - | 144 B |
| DapperExecuteScalarWithConvert | 106.98 ns | 1.846 ns | 2.648 ns | 100.81 ns | 111.66 ns | 110.01 ns | 0.0085 | - | 144 B |
| SmartExecuteScalarWithConvert | 68.63 ns | 1.598 ns | 2.392 ns | 65.01 ns | 72.48 ns | 72.33 ns | 0.0100 | - | 168 B |
| DapperQuery100 | 2,672.12 ns | 35.815 ns | 53.606 ns | 2,564.74 ns | 2,796.08 ns | 2,750.02 ns | 0.3477 | 0.0039 | 5880 B |
| SmartQuery100 | 1,192.38 ns | 29.696 ns | 44.447 ns | 1,132.81 ns | 1,289.95 ns | 1,255.94 ns | 0.2090 | - | 3520 B |
| DapperQuery100Bufferd | 2,480.81 ns | 29.533 ns | 44.203 ns | 2,391.34 ns | 2,577.36 ns | 2,525.80 ns | 0.3477 | 0.0039 | 5840 B |
| SmartQuery100Bufferd | 1,143.32 ns | 20.661 ns | 29.631 ns | 1,078.75 ns | 1,216.55 ns | 1,171.49 ns | 0.3301 | 0.0039 | 5536 B |
| DapperQueryFirst | 270.77 ns | 2.722 ns | 3.990 ns | 262.91 ns | 277.72 ns | 275.80 ns | 0.0200 | - | 336 B |
| SmartQueryFirst | 192.03 ns | 2.772 ns | 4.149 ns | 186.47 ns | 201.72 ns | 196.45 ns | 0.0146 | - | 248 B |
Not so late( ˙ω˙)?