news 2026/4/21 8:03:44

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从数据采集到回放验证: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);

}

2. 调用方式如下

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

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

参数直接使用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);

4. 特别注意不要在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);

}

2. 以上调用的例子如下

[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);

}

2. 中规中矩的调用方式

var service = new AccountGetService(_table, _builder);

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

Assert.NotNull(account);

3. 支持简单调用方式

var service = new AccountGetService(_table, _builder);

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

Assert.NotNull(account);

四、总结

DBShadow.net预编译比较智能

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

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

参数和返回值类型还可以定义为泛型,可以做到更加灵活悍酪滓咽

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 20:46:00

3步掌握Autovisor:彻底改变你的智慧树学习体验

3步掌握Autovisor:彻底改变你的智慧树学习体验 【免费下载链接】Autovisor 2025智慧树刷课脚本 基于Python Playwright的自动化程序 [有免安装版] 项目地址: https://gitcode.com/gh_mirrors/au/Autovisor 还在为智慧树课程的繁琐操作而烦恼吗?每…

作者头像 李华
网站建设 2026/4/11 20:44:48

软件智能客服中的多轮对话管理

**软件智能客服中的多轮对话管理:让交互更智能** 在数字化服务快速发展的今天,软件智能客服已成为企业与用户沟通的重要桥梁。简单的单轮问答往往无法满足复杂需求,多轮对话管理技术应运而生。它通过上下文理解、意图识别和动态响应&#xf…

作者头像 李华
网站建设 2026/4/11 20:43:08

EasyPlayer.js快速集成指南:从安装到实战应用

1. 为什么选择EasyPlayer.js? 最近在做一个智慧园区项目时,需要在前端实现多路视频实时监控。试过市面上好几个播放器组件,最终选择了EasyPlayer.js。这个基于JavaScript的流媒体播放器特别适合需要快速集成RTSP/RTMP/HLS等协议播放的场景&am…

作者头像 李华
网站建设 2026/4/11 20:40:08

如何5分钟搞定抖音批量下载:douyin-downloader完整使用指南

如何5分钟搞定抖音批量下载:douyin-downloader完整使用指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback …

作者头像 李华
网站建设 2026/4/11 20:37:26

Ubuntu双系统下NTFS分区读写失败?3步搞定Windows休眠导致的挂载问题

Ubuntu双系统下NTFS分区读写失败的终极解决方案 每次从Windows切换到Ubuntu,发现NTFS分区变成只读状态,无法保存文件?这种困扰在双系统用户中极为常见。问题的根源往往在于Windows的快速启动功能——这个设计用来加速系统启动的特性&#xff…

作者头像 李华
网站建设 2026/4/11 20:35:11

增强现实应用图像识别与空间定位

**增强现实:图像识别与空间定位的科技魅力** 在数字化浪潮中,增强现实(AR)技术正逐渐改变我们与世界的交互方式。通过图像识别与空间定位,AR能够将虚拟信息无缝叠加到现实场景中,为教育、医疗、娱乐等领域…

作者头像 李华