C#使用Tuple方法实现OpreateResultModel功能

OperateResultModel 类

典型的通用操作结果模型,常用于Web 开发、API 设计和前后端交互,主要作用如下:

  1. 统一接口返回格式:为所有操作提供一致的响应结构

  2. 传递操作状态 :通过 success 字段表示操作是否成功

  3. 携带操作消息 :通过 msg 字段传递错误信息或成功提示

  4. 返回操作数据 :通过 rows /data 字段返回查询结果或操作对象

  5. 支持分页查询 :包含分页相关的字段(total, page, pagesize 等)

使用场景

  1. API 响应:作为 RESTful API 的标准返回格式
  2. AJAX 请求:前端通过 AJAX 获取数据时的标准响应格式
  3. 分页查询:在需要分页的列表查询中返回分页信息
  4. 通用操作结果:增删改查CURD等各种操作的统一返回格式

Tuple 类

Tuple(元组)是一种轻量级的数据结构,用于将多个值组合成一个单一对象,主要作用如下**:**

  1. 基础操作结果 Tuple 结构:(bool Success, string Message)

  2. 带数据的操作结果 Tuple 结构:(bool Success, T Data, string Message)

  3. 分页查询结果 Tuple 结构:(bool Success, List<T> Data, int Total, string Message)

  4. 扩展分页 Tuple 结构(含页码参数):(bool Success, List<T> Data, int Total, int Page, int PageSize, string Message)

  5. 命名元组(增强语义可读性):(bool IsSuccess, T ResultData, int TotalCount, string ErrorMessage)

使用场景

1.临时数据结构:不需要在多处重用的简单数据

2.方法返回值:快速返回多个值,无需创建专门的类

3.LINQ 查询:简化投影结果

4.轻量级需求:不需要复杂的行为或属性

Tuple 模型与原 OperateResultModel 的核心对应关系

原模型字段 Tuple 元素 作用
success Success/IsSuccess 标识操作成功与否(布尔值)
msg Message/ErrorMessage 传递操作提示或错误信息
rows/data Data/ResultData 返回查询结果或操作对象(泛型)
total Total/TotalCount 分页总记录数
page/pagesize Page/PageSize 分页参数(当前页、页大小)

示例:替换 OperateResultModel

假设原有代码:

csharp

复制代码
public class OperateResultModel {
    public bool success { get; set; }
    public object data { get; set; }
    public string msg { get; set; }
}

public OperateResultModel CreateSignFlow(...) {
    // 业务逻辑...
   OperateResultModel orm = new OperateResultModel();
  
        orm.success = true,
        orm.data = new SysSignJumpModel(),
        orm.msg = "创建成功"
    };
}

使用 Tuple 后:

csharp

复制代码
public Tuple(bool Success, SysSignJumpModel Data, string Message) CreateSignFlow(...) {
    // 业务逻辑...

    return new Tuple(true, new SysSignJumpModel(), "创建成功");
}

调用时:

csharp

复制代码
Tuple<bool, model, string> ret = headBll.CreateSignFlow(headmodel);
if (success) {
    // 使用 model...
      orm.success = ret.Item1;
      orm.rows = ret.Item2;
      orm.msg = ret.Item3;
}
        else
        {
            orm.msg = "[]";//空字符串,null
            orm.success = false;
        }
    }
    catch (Exception ex)
    {
        orm.msg = ex.Message;
        orm.success = false;
    }
    return JsonResultHelper.Convert(orm);
}

SQLSugar 中 ExecuteCommand () 的三种返回值处理方式

在 SQLSugar ORM 框架中,.ExecuteCommand() 方法用于执行 SQL 命令并返回受影响的行数。这三种处理方式的区别在于对返回值的判断逻辑:

  1. ExecuteCommand()
  • 返回值类型int(受影响的行数)
  • 用途:获取实际影响的记录数,不做条件判断
  • 适用场景
    • 需要知道具体删除 / 更新了多少条记录
    • 后续逻辑依赖于具体的行数(如批量操作统计)

csharp

复制代码
// 示例:获取实际删除的记录数
int deletedCount = db.Deleteable<TbUserRoleBodyModel>()
    .Where(t => t.ORDERNO == "ORD2023001")
    .ExecuteCommand();
    
// 后续使用 deletedCount 进行统计或日志记录
  1. ExecuteCommand() == 1
  • 返回值类型bool(是否恰好删除 / 更新 1 条)
  • 用途 :确保操作只影响了单条记录
  • 适用场景
    • 删除 / 更新唯一记录(如主键查询)
    • 业务规则要求必须且只能修改一条记录

csharp

复制代码
// 示例:删除特定订单(必须存在且只能存在一条)
bool success = db.Deleteable<TbUserRoleHeadModel>()
    .Where(t => t.ORDERNO == "ORD2023001")
    .ExecuteCommand() == 1;
    
// 如果没有记录或删除多条,都会返回 false
  1. ExecuteCommand() > 0
  • 返回值类型bool(是否删除 / 更新至少 1 条)
  • 用途 :确保操作至少影响了一条记录
  • 适用场景
    • 批量删除 / 更新(不确定具体数量)
    • 业务规则允许删除多条记录(如删除订单下的所有明细)

csharp

复制代码
// 示例:删除订单下的所有明细(可能有0~N条)
bool success = db.Deleteable<TbUserRoleBodyModel>()
    .Where(t => t.ORDERNO == "ORD2023001")
    .ExecuteCommand() > 0;
    
// 删除0条返回 false,删除1~N条返回 true

实际应用对比

场景 1:删除用户唯一配置

csharp

复制代码
// 必须恰好删除1条(用户配置必须存在且唯一)
bool success = db.Deleteable<ParamsTbModel>()
    .Where(p => p.USER_ID == userId && p.KEY == "NOTIFICATION_SETTING")
    .ExecuteCommand() == 1;

场景 2:删除订单下的所有明细

csharp

复制代码
// 可能删除0~N条(订单可能没有明细)
bool success = db.Deleteable<TbOrderDetail>()
    .Where(d => d.ORDER_ID == orderId)
    .ExecuteCommand() > 0;

注意事项

  1. 性能差异

    • 直接使用 ExecuteCommand() 性能最优(无需额外判断)
    • == 1> 0 会增加一次比较操作
  2. 业务逻辑风险

    • 使用 == 1 时,如果记录不存在或存在多条,会返回 false
    • 使用 > 0 时,如果记录不存在,会返回 false
  3. 并发问题

    • 在高并发场景下,建议使用事务或乐观锁
    • 避免在删除前查询记录数(可能导致脏读)
相关推荐
丘大梨8 分钟前
QT 基础聊天应用项目文档
运维·数据库·系统架构
杜子不疼.26 分钟前
《Python学习之第三方库:开启无限可能》
开发语言·python·学习
怀刃26 分钟前
C# 内存监控怎么定位问题
运维
TPBoreas27 分钟前
Jenkins启动端口修改失败查找日志
运维·服务器·jenkins
张人玉1 小时前
C#读取文件, IO 类属性及使用示例
microsoft·c#
青川入梦1 小时前
MyBatis极速通关上篇:Spring Boot环境搭建+用户管理实战
java·开发语言·mybatis
CC__xy1 小时前
04 类型别名type + 检测数据类型(typeof+instanceof) + 空安全+剩余和展开(运算符 ...)简单类型和复杂类型 + 模块化
开发语言·javascript·harmonyos·鸿蒙
萤丰信息1 小时前
技术赋能安全:智慧工地构建城市建设新防线
java·大数据·开发语言·人工智能·智慧城市·智慧工地
Pocker_Spades_A2 小时前
飞算JavaAI家庭记账系统:从收支记录到财务分析的全流程管理方案
java·开发语言
正在努力的小河2 小时前
Linux设备树简介
linux·运维·服务器