await using var conn = _dataSource.CreateConnection();
var sql = "SELECT \"Id\",\"Title\",\"Content\",\"Done\",\"LastTime\" FROM \"Todo\" WHERE \"Id\"=@Id";
var first = await conn.QueryFirstOrDefaultAsync<Todo>(sql, _todo);
DbDataSource _dataSource = new StringDataSource("Data Source=file::memory:;Cache=Shared", conn => new SqliteConnection(conn));
2. DBShadow代码
使用SqliteEngine处理数据库方言
使用Mapper.Default处理类型映射
ShadowCachedBuilder用来编译和缓存
复制代码
var first = await _shadowSelect.GetFirstAsync<Todo, Todo?>(_executor, _todo);
ISqlEngine engine = new SqliteEngine();
ShadowExecutor _executor = ShadowBuilder.CreateCache(engine, Mapper.Default);
TodoTable _table = new("Todo");
ISelect _shadowSelect = _table.ToQuery()
.And(_table.Id.Equal())
.ToSelect()
.SelectSelfColumns();
3. 用BenchmarkDotNet对比一下
DBShadow比Dapper快10%
内存也占优
以下是基于.net8,DBShadow支持.net10,Dapper没有.net10版本
为了公平降级对比
其实DBShadow在.net10下更快
Method
Mean
Error
StdDev
Ratio
RatioSD
Gen0
Gen1
Allocated
Alloc Ratio
Dapper
4.636 us
0.0194 us
0.0216 us
1.00
0.01
0.1400
-
2.38 KB
1.00
DBShadow
4.030 us
0.0152 us
0.0175 us
0.87
0.01
0.1300
-
2.2 KB
0.92
三、再用Mysql对比一下
1. Dapper代码
复制代码
await using var conn = _dataSource.CreateConnection();
var sql = "SELECT `Id`,`Title`,`Content`,`Done`,`LastTime` FROM `Todo` WHERE `Id`=@Id";
var first = await conn.QueryFirstOrDefaultAsync<Todo>(sql, _todo);
string ConnectionString = "Server=localhost;Database=Benchmarks;User=root;Password=123456;";
DbDataSource _dataSource = new MySqlDataSource(ConnectionString);
2. DBShadow代码
使用MySqlEngine处理数据库方言
使用Mapper.Default处理类型映射
ShadowCachedBuilder用来编译和缓存
复制代码
var first = await _shadowSelect.GetFirstAsync<Todo, Todo?>(_executor, _todo);
ISqlEngine engine = new MySqlEngine();
ShadowCachedBuilder _executor = ShadowBuilder.CreateCache(engine, Mapper.Default);
TodoTable _table = new("Todo");
ISelect _shadowSelect = _table.ToQuery()
.And(_table.Id.Equal())
.ToSelect()
.SelectSelfColumns();