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

高光谱成像基础(十一)异常检测算法 RX 与 KRX合

一、简化查询

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

相关文章:

  • 别再只用数字灰度传感器了!试试这款串口输出的巡线模块,让STM32小车巡线代码简化80%
  • 本模型为声固耦合与两相流耦合多物理场模型,包含声流层流、相场、压力声学、固体力学模块,已设置并...
  • RK3588模型部署避坑指南:为什么你的ONNX转RKNN总失败?从预处理对齐到量化数据集详解
  • 如何快速部署本地AI写作工具:KoboldAI完全指南 [特殊字符]
  • 杰理之RX无法获取配对码问题【篇】
  • SITS2026首发实录:2026年自然语言处理已进入AI原生纪元——你还在用传统Pipeline?
  • 从MCAS系统失效到监管失察:波音737MAX空难的工程伦理再审视
  • 58%美国人接受AI帮你网购比价,Agentic AI正在改变电商
  • 3步解锁VMware macOS虚拟机:开源工具Unlocker完整指南
  • 鲁班猫4 rk3588 IIC驱动0.96寸OLED,打造实时系统监控屏并实现后台守护
  • DAC8568 Controller: Mastering Serial Interface and Timing Control
  • 在i.MX6ULL开发板上,用Buildroot配置Qt5+tslib触摸屏的完整环境搭建笔记
  • C#实战固高GTS运动控制卡:从IO控制到多线程状态监控的二次开发指南
  • NeoSWSerial:资源受限MCU的高可靠软件串口方案
  • PLC工程师必备:用S7-1200的Slice寻址实现产线IO信号高效映射(附TIA Portal工程文件)
  • 从安全工具开发视角看驱动遍历:如何用C语言在Windows内核里‘看见’所有sys文件
  • 05. 路径优化:TSP 与 VRP
  • MySQL Explain 结果详解
  • 【51单片机】【Proteus仿真】 十字路口交通灯系统:从仿真到代码的实战解析
  • 杰理之test 板级下串口升级失败问题【篇】
  • 自动化运维平台搭建
  • 06. 调度问题求解
  • 35岁程序员必看:收藏这份智能体(Agent)开发指南,开启你的“第二曲线”!
  • 、SEATA分布式事务——XA模式桃
  • Go语言的context.WithTimeout超时控制与取消信号在网络编程中的传播
  • CAN BLF包解析实战:从原始报文到可读数据的Python解码之旅
  • 从“能成像”到“像质好”:手把手教你用Zemax优化一个F/4单透镜(附完整操作截图)
  • 07. 装箱与切割问题
  • 别再让FPU等总线了!STM32G474的CCM SRAM实战:把DSP算法速度提升20%的保姆级配置
  • 【笔面试算法学习专栏】KMP算法:字符串匹配的艺术