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

相关文章:

  • SDMatte提示词工程指南:编写精准Prompt提升复杂图像抠图质量
  • FireRedASR Pro应用案例:搭建个人语音笔记系统,会议录音秒变文字稿
  • C++高性能扩展:多模态语义引擎核心算法优化
  • Phi-3-Mini-128K效果实测:128K上下文中保持数学公式推导连贯性
  • 忍者像素绘卷PyCharm开发环境搭建与调试技巧详解
  • Steam成就管理器:3步解锁你所有Steam游戏成就的终极方案
  • 权威出品 | SBTI 赋分机制全解析
  • 像素幻梦创意工坊新手教程:3步搭建你的专属像素艺术生成器
  • GLM-4-9B-Chat-1M保姆级教程:VS Code远程开发环境一键调试配置
  • HY-MT1.5-1.8B应用案例:搭建跨境电商翻译助手
  • 虚拟现实VR系统中的渲染优化与交互设计
  • 终极指南:如何用Sunshine自建游戏串流服务器实现跨设备畅玩
  • MAXIM美信 MAX1673ESA+T SOP8 电荷泵
  • AI 净界零基础教程:如何用 RMBG-1.4 自动生成透明 PNG 素材
  • 免费SQLite浏览器终极指南:浏览器中直接管理数据库的完整解决方案
  • Display Driver Uninstaller深度解析:为什么这是显卡驱动清理的终极解决方案?
  • 2026年AI优化公司哪家靠谱?行业选择要点解析 - 品牌排行榜
  • 手把手教你用IndexTTS 2.0:从安装到生成第一段语音,超详细教程
  • 2026警用电动车供应商行业现状及应用场景分析 - 品牌排行榜
  • 向后兼容的工程伦理:Python 开发中“优雅重构”与“责任担当”的平衡之道
  • Phi-3-Mini-128K开源大模型部署教程:适配A10/A100/L4等企业级GPU集群
  • RexUniNLU模型部署避坑指南:常见错误及解决方法
  • STM32串口Bootloader实战:基于Ymodem协议与STM32F303RCT6的移植与优化
  • 全任务零样本学习-mT5中文-baseAPI教程:POST /augment_batch批量处理最佳实践
  • 如何突破网易云音乐格式限制?三分钟掌握NCM文件解密技巧
  • LOWPOWER微源 LP3100QVF TDFN-12 电荷泵
  • 告别显存焦虑!FLUX.1-dev旗舰版保姆级部署,小白也能画高清壁纸
  • 聊聊2026年专业的AI GEO推广机构,山东地区靠谱的有哪些 - 工业品牌热点
  • 终极性能调校:Universal x86 Tuning Utility如何释放你的硬件潜能
  • 如何用OneMore插件实现高效笔记管理:5个实用技巧提升OneNote生产力