当前位置: 首页 > news >正文

从数据采集到回放验证: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个参数时支持化繁为简,支持直接传值做为参数值

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

参数和返回值类型还可以定义为泛型,可以做到更加灵活业送岗兑

http://www.jsqmd.com/news/610092/

相关文章:

  • 打工人必备!8个AI办公神器,每天准时下班不是梦
  • C++信号量(Semaphore)实战:多线程同步的艺术
  • 4月8号
  • 技术分享 | 一则Oracle数据库IO性能问题分析案例
  • 前瞻2026:不锈钢轧花网选型指南与安平实力服务商解析 - 2026年企业推荐榜
  • SEATA分布式事务——AT模式一
  • 河北球场围栏实力盘点:2026年五大优质服务商深度测评与采购指南 - 2026年企业推荐榜
  • 嵌入式裸机开发中的轻量级定时调度方案
  • 职场人AI生存指南:10个核心技能,让你不被AI淘汰反而被赋能
  • 2026年江苏婚姻家事法律服务市场深度解析:6家顶尖律师团队专业力评估 - 2026年企业推荐榜
  • 0欧姆电阻在电子设计中的11种妙用
  • 【typst-rs】greet.rs文件
  • 嵌入式舵机精确控制:基于硬件定时器的PWM脉宽稳定实现
  • Cocos Creator 3.x 高维护性打字机对话系统设计与实现
  • 2026年通体砖公司权威推荐:糖果釉瓷砖/素色瓷砖/维多利亚瓷砖/网红瓷砖/耐磨瓷砖/肌肤釉瓷砖/花砖/选择指南 - 优质品牌商家
  • 嵌入式系统代码重构实战与优化技巧
  • 显示器EDID数据解析全攻略:从制造商ID到色彩特性的秘密
  • 【渗透工具】Venom多级代理实战:从零构建内网渗透通道
  • STM32总线架构解析与性能优化实战
  • SetFit采样策略完全解析:如何选择最佳数据增强方案
  • 如何科学选择青少年焦虑干预服务?2026年武汉专业服务深度盘点与决策指南 - 2026年企业推荐榜
  • YOLO26改进 - 注意力机制 | EMA (Efficient Multi-Scale Attention) 高效多尺度注意力:跨空间学习与多分支协同增强特征表征,优化多尺度目标检测
  • 从零开始:在RK3588上运行RKNN版YOLOv5目标检测(保姆级教程)
  • STM32duino双VL6180X ToF传感器驱动库深度解析
  • 单片机SFR访问原理与C语言实现方法
  • 【算法日记】Day 9 动态规划专题——最长递增子序列问题及扩展
  • I2C总线原理与应用实战指南
  • YOLO11 改进 - 特征融合 | MSAA多尺度注意力聚合模块, 多尺度卷积融合与双通道注意力机制
  • 视频处理效率提升方案:基于JianYingApi的自动化剪辑实践指南
  • 嵌入式C语言设计模式实践:观察者与责任链模式