当前位置: 首页 > 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.cnnetsun.cn/news/1787172.html

相关文章:

  • 亚马逊 Kindle 设备限制更新,旧设备何去何从?
  • Steam Achievement Manager:游戏成就全流程管理工具详解
  • 3分钟解锁Windows安卓应用安装:告别模拟器的高效解决方案
  • 洛阳四联疗法治疗周期及注意事项全解析
  • 【GUI-Agent】阶跃星辰 GUI-MCP 解读---()---命令解析和工具映射彝
  • Translumo:突破语言壁垒的终极免费实时屏幕翻译工具
  • Java响应式最后一公里:Loom原生支持下的WebMvc→WebFlux渐进式迁移路线图(仅限首批内测团队获取)
  • 国产大模型DeepSeek首次推出模式分层功能,开启V4版本灰度测试,引发行业广泛关注
  • 龙虾白嫖指南,请查收~揖
  • 不记命令也能排障:catpaw chat 实战手册诼
  • 私有化大模型 + RAG + Agent + 百万并发系统设计(2026企业AI平台完整架构)
  • 使用Microsoft Agent Framework构建C# AI代理握
  • 告别臃肿卡顿,拥抱极速隐私:Win11Debloat让Windows焕发新生
  • 深度解析:轻量级 AES-128 CFB 加密实现
  • gte-base-zh与智能体(Agent)协作:构建自主调研与报告生成系统
  • GoCodingInMyWay紫
  • 3分钟学会:Windows电脑直接安装安卓APK的终极指南
  • 构建多模态 AI Agent Harness Engineering:文本、图像与语音的统一理解
  • 案例速递|手机摄像头模组底壳检测
  • 【信创攻坚实战手册】:PHP 8.1+Laravel+TiDB容器化部署全流程——从源码编译国密SM4扩展到K8s Helm Chart一键发布
  • 5个关键步骤:Ryujinx模拟器从入门到流畅运行Switch游戏
  • 收藏必学!AI Agent上下文工程深度解析:Manus、Cursor、OpenAI等巨头技术方案横向对比
  • 手势识别与追踪:MediaPipe Hands在AR场景中的落地应用
  • 打造个人数字图书馆:Talebook私有化部署全攻略
  • MySQL备份还原方法2----LVM
  • Cursor免费试用限制如何突破?go-cursor-help完整实用指南深度解析
  • 校园商铺管理|基于springboot + vue校园商铺管理系统(源码+数据库+文档)
  • Kazumi番剧播放器:从零开始快速上手终极指南
  • react坑点记录
  • 失业期PHP程序员,你用什么态度对事,事就用什么结果对你。