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

Agent-Sandbox UI 上线,来看看有哪些的功能是你经常使用的?诺

一、简化查询

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/631681/

相关文章:

  • 紧急预警:未实施自动化测试用例生成的大模型服务,平均上线后缺陷逃逸率高达68%——立即部署这4个轻量级生成插件
  • SpringBoot 环境配置解析:Environment 与 PropertySource
  • STM32F0 RS485半双工通信库:精准方向控制与裸机优化
  • __block 变量内存布局详解岗
  • 2026届必备的六大降AI率网站实际效果
  • Python如何声明变量_动态类型特性与变量命名规范
  • Skills 编写学习罕
  • 彻底吃透哨兵值:从底层逻辑到自定义设计(附原创值域理论)
  • Melopero VL53L1X Arduino驱动库详解:高精度ToF测距集成指南
  • WindRunnerMax使
  • GPU还是NPU?HBM带宽、INT4吞吐、能效比TOP3芯片横向测评(SITS2026专家闭门报告)
  • 告别迷茫:手把手教你用Linux内核pci-epf-test快速验证PCIe Endpoint硬件
  • 使用 C# 删除 PDF 中的数字签名藤
  • Superpowers - 07 从 SessionStart Hook 看 Superpowers:把「技能库」变成「行为操作系统」
  • **发散创新:基于Python的自主系统任务调度与决策优化实战**在现代人工智能与嵌入式系统的融合浪潮中,**自主系统(A
  • 嵌入式摇杆驱动库:ADC采样、按键去抖与跨平台设计
  • 大卫小东(Sheldon)材
  • 拆穿名词诈骗!用大白话理解晦涩难懂的AI概念侔
  • .NET对象转JSON,到底有几种方式?韭
  • Ostrakon-VL-8B部署避坑指南:解决‘Data incompatible with messages format’兼容性问题
  • 学习数据结构的心得
  • 使用 fastkde 对单变量样本进行点密度预测的完整教程
  • ESPS USB MSC 调试全过程记录貌
  • 《小坦克大战小怪兽》小游戏实战三:服务端网络通信 WebSocket + Actor 模型深度解析
  • 机器学习38:距离度量与特征处理
  • [前端 | promise 用法]
  • 快手Blaze引擎开源:揭秘Spark向量化技术的性能飞跃与生产实践
  • 大模型修炼秘籍 第一卷灵气采集 第一章:天地为炉——海量数据之采集
  • Docker + Jenkins + Nginx实现前端自动化部署
  • Openclaw接入自动发文教程送