从数据采集到回放验证:ADTF 适配 ROS 的 ADAS 测试实践山

一、简化查询

  1. 先看一下查询的例子

///
/// 账户获取服务

///

///

///

public class AccountGetService(AccountTable table, IShadowBuilder builder)

{

private readonly SqlSource _source = new(builder.DataSource);

private readonly IParamQuery _accountQuery

= builder.BuildResult(

table.ToQuery()

.And(account => account.Id.Equal())

.ToSelect()

.SelectSelfColumns()

);

///
/// 获取账户

///

///

///

///

public Task GetAsync(Account param, CancellationToken token = default)

=> _accountQuery.GetFirstAsync(_source, param, token);

}

  1. 调用方式如下

var account = await accountGetService.GetAsync(new Account { Id = 1L });

  1. 这个例子我们可以简化一下

参数直接使用Id(类型由Account简化为long)

很大一部分数据库操作都只有一个参数(GetById、GetByName等)

为此定义一个含单个属性类有点浪费

按上面的例子使用实体类作为参数也感觉怪怪的

DBShadow.net支持这种简化操作

单个参数无需封装,直接使用参数类型即可

public class AccountGetService(AccountTable table, IShadowBuilder builder)

{

private readonly SqlSource _source = new(builder.DataSource);

private readonly IParamQuery _accountQuery

= builder.BuildResult(

table.ToQuery()

.And(account => account.Id.Equal())

.ToSelect()

.SelectSelfColumns()

);

public Task GetAsync(long accountId, CancellationToken token = default)

=> _accountQuery.GetFirstAsync(_source, param, token);

}

var account = await accountGetService.GetAsync(1L);

  1. 特别注意不要在Dapper中这样使用

Dapper是不支持这种简化操作

以下Dapper错误示例会抛出异常

System.InvalidOperationException:"Must add values for the following parameters: @Id"

await using var conn = _dataSource.CreateConnection();

var sql = "SELECT \"Id\",\"Title\",\"Content\",\"Done\",\"LastTime\" FROM \"Todo\" WHERE \"Id\"=@Id";

var first = await conn.QueryFirstOrDefaultAsync(sql, 1L);

二、 集合参数也支持简化操作

  1. IN查询简化的例子

In的参数名是可选和前面例子的Equal是一样的,默认字段名

In查询的实参支持数组、集合及字典

只有In一个集合参数时支持直接传数组、集合或字典

这时参数名(eg: AccountIds)就无所谓取什么名了

因为不需要按参数名反射获取属性了

///
/// 批量账户获取服务

///

///

///

public class AccountBatchService(AccountTable table, IShadowBuilder builder)

{

private readonly SqlSource _source = new(builder.DataSource);

private readonly IParamQuery _accountQuery

= builder.BuildResult(

table.ToQuery()

.And(account => account.Id.In("AccountIds"))

.ToSelect()

.SelectSelfColumns()

);

///
/// 批量获取账户

///

///

///

///

public IAsyncEnumerable GetAsync(long\[\] accountIds, CancellationToken token = default)

=> _accountQuery.QueryAsync(_source, accountIds, token);

}

  1. 以上调用的例子如下

Fact

public async Task Batch()

{

var count = 0;

var service = new AccountBatchService(table, builder);

var list = service.GetAsync(1L, 2L, 3L);

await foreach (var item in list)

{

_output.WriteLine($"{item.Id}:{item.Amount}");

count++;

}

Assert.Equal(3, count);

}

// 1:100

// 2:200

// 3:300

三、泛型查询

  1. 泛型服务类代码

该服务用来按字段Id查询表Account

参数TParam是泛型,这样可以直接使用DTO参数来查询,减少类型转化的开销

返回值TAccount也是泛型,这样就可以直接返回视图模型或者领域模型

这样的泛型服务类就非常的通用

///
/// 账户获取泛型服务

///

///

///

public class AccountGetService(AccountTable table, IShadowBuilder builder)

{

private readonly SqlSource _source = new(builder.DataSource);

private readonly IParamQuery _accountQuery

= builder.BuildResult(

table.ToQuery()

.And(account => account.Id.Equal())

.ToSelect()

.SelectSelfColumns()

);

///
/// 获取账户

///

///

///

///

public Task GetAsync(TParam param, CancellationToken token = default)

=> _accountQuery.GetFirstAsync(_source, param, token);

}

  1. 中规中矩的调用方式

var service = new AccountGetService(_table, _builder);

var account = await service.GetAsync(new Account { Id = 1L });

Assert.NotNull(account);

  1. 支持简单调用方式

var service = new AccountGetService(_table, _builder);

var account = await service.GetAsync(1L);

Assert.NotNull(account);

四、总结

DBShadow.net预编译比较智能

只有1个参数时支持化繁为简,支持直接传值做为参数值

这样可以节约定义只有一个属性的参数类

参数和返回值类型还可以定义为泛型,可以做到更加灵活蚁炙甘褐

相关推荐
橙露19 分钟前
夸克网盘 v.4.5.2.516 免更新绿色版,方便使用!
分享·网盘
广东程序猿小展4 小时前
《深海迷航2》风灵月影修改器下载分享 深海迷航2修改器及用法说明
分享
汤姆yu20 天前
基于python大数据的高校舆情监测系统的设计与实现
大数据·开发语言·python·分享·分析·舆情
广东程序猿小展22 天前
《生化危机2重制版》v2024.01.09十一项修改器
分享
boY039RmU3 个月前
jafeaalalalaflal卡拉拉啊
分享
FCJ97Lrv93 个月前
TypeScript入门指南:30分钟速成
分享
Ze3G90nYt3 个月前
DotNetPy:现代.NET 与 Python 互操作 实战指南
分享
ExC1dNtqz3 个月前
Redis命令处理机制源码探究
分享
cewIv5sa24 个月前
解决ArchLinux中Edge无法联网问题
分享
pFg0v4O7P4 个月前
CKKS 同态加密数学基础推导
分享