当前位置: 首页 > 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/611841/

相关文章:

  • BetterGI:3个革命性的智能辅助功能让原神玩家体验升级
  • RVC效果对比评测:vs So-VITS-SVC、DiffSinger、VITS2
  • 好写作AI:毕业论文“智造”新纪元,开启你的学术超能力!
  • OpenClaw+Phi-3-vision-128k-instruct:科研人员的文献图表处理助手
  • AnythingLLM 部署优化指南:从环境适配到性能调优的全流程解决方案
  • Face3D.ai Pro与Qt集成:桌面端应用开发
  • SAP ABAP | 按 F4 搜索帮助直接 Dump?一招解决 SYNTAX_ERROR 报错
  • 快速入门:5步掌握OCR文字识别镜像,轻松提取图片文字
  • Pixel Aurora Engine 数据库课程设计辅助:ER图与数据流图智能生成
  • 效果展示:QWEN-AUDIO智能语音合成真实案例,声音太自然了
  • Fun-ASR多语言语音识别:5分钟快速部署,开箱即用
  • 自定义数据集 Pose 生成与坐标系约定内部文档
  • Asian Beauty Z-Image Turbo效果验证:对“丹凤眼”“柳叶眉”“樱桃小口”等特征建模精度
  • 新品冷启动:没有历史数据怎么预测?我用聚类+迁移学习解决了
  • 让 AI 代理拥有“专业技能包“:Microsoft Agent Skills厩
  • Fun-ASR-MLT-Nano-2512实战教程:FFmpeg音频降噪预处理提升远场识别率
  • 时序智能的基石:从核心原理到工程实践,全面掌握递归神经网络 (RNN)
  • 告别编译折腾!openEuler ARM平台一键部署vdbench性能测试工具的懒人脚本分享
  • 什么是 Spec?AI 编程时代更高效、可控的开发方法
  • Lychee-Rerank高可用部署架构:基于Docker Compose的多实例负载均衡
  • Kandinsky-5.0-I2V-Lite-5s环境隔离:Anaconda创建独立Python环境部署
  • 从心所欲不逾矩:一种自感澄明的儒家工夫现象学 ——兼论“自我即自感”与儒家心性论的对话
  • Linux 或者 Ubuntu 离线使用 vllm启动大模型
  • 圣女司幼幽-造相Z-Turbo入门指南:Gradio界面功能详解——正向提示词/采样步数/CFG权重
  • MES上线之后,为什么生产还是一团乱
  • 2026年主流面霜综合评测:六款高端产品实力解析,助你精准选择
  • PaddlePaddle-v3.3镜像测评:开箱即用的深度学习平台,到底有多方便?
  • 京城邮票回收乱象频发!藏家避坑指南:认准丰宝斋,童叟无欺上门服务获盛赞 - 品牌排行榜单
  • 简明教程:实现OpenCLaw轻量级应用服务器部署及Ollama大模型本地化诙
  • 【JAVA基础面经】== 和 equals() 的区别