// ============================================================================ // 【文件说明】HwProductInfoJoinDetailRow.cs - 产品信息关联明细行 DTO // ============================================================================ // 这是一个"数据传输对象"(DTO),用于接收 SQL JOIN 查询的扁平结果集。 // // 【什么是 DTO?】 // DTO = Data Transfer Object(数据传输对象) // 用于在不同层之间传输数据,不包含业务逻辑。 // // 【为什么需要这个类?】 // SQL JOIN 查询返回的是"扁平结构": // 产品ID | 产品名称 | 明细ID | 明细标题 | ... // 1 | 产品A | 101 | 明细1 | ... // 1 | 产品A | 102 | 明细2 | ... // // 每行包含产品字段 + 明细字段,需要用这个类接收。 // 然后在 Service 层通过 LINQ GroupBy 转换成树形结构。 // // 【命名约定】 // Row 后缀表示"行",代表 SQL 结果集的一行。 // Join 表示这是 JOIN 查询的结果。 // ============================================================================ namespace Admin.NET.Plugin.HwPortal; /// /// 产品信息关联明细行 DTO。 /// /// 【C# 语法知识点 - internal sealed class】 /// internal:只能在当前程序集(Assembly)内访问。 /// sealed:密封类,不能被继承。 /// /// 为什么用 internal? /// 这个类只在插件内部使用,不需要暴露给外部。 /// /// 为什么用 sealed? /// 1. 这个类不需要被继承 /// 2. 密封类可以有编译器优化(虚方法调用转直接调用) /// /// 对比 Java: /// Java 用 package-private(不写访问修饰符)实现类似 internal 的效果。 /// Java 用 final 关键字实现 sealed 的效果: /// final class HwProductInfoJoinDetailRow extends HwProductInfo { ... } /// /// /// 【继承设计】 /// : HwProductInfo 表示继承自产品信息实体类。 /// 这样这个类就包含了产品的所有字段,再加上明细字段。 /// /// 对比 Java: /// Java 的继承写法一样: /// class HwProductInfoJoinDetailRow extends HwProductInfo { ... } /// /// /// 【字段命名约定】 /// Sub 前缀表示"子表字段"(明细表字段): /// - SubProductInfoDetailId:明细ID /// - SubProductInfoDetailTitle:明细标题 /// - ... /// /// 这样可以区分主表字段和子表字段,避免命名冲突。 /// /// internal sealed class HwProductInfoJoinDetailRow : HwProductInfo { /// /// 明细ID(子表字段)。 /// [SugarColumn(ColumnName = "sub_product_info_detail_id")] public long? SubProductInfoDetailId { get; set; } /// /// 明细父ID(子表字段)。 /// [SugarColumn(ColumnName = "sub_parent_id")] public long? SubParentId { get; set; } /// /// 明细所属产品ID(子表字段)。 /// [SugarColumn(ColumnName = "sub_product_info_id")] public long? SubProductInfoId { get; set; } /// /// 明细标题(子表字段)。 /// [SugarColumn(ColumnName = "sub_product_info_detail_title")] public string SubProductInfoDetailTitle { get; set; } /// /// 明细描述(子表字段)。 /// [SugarColumn(ColumnName = "sub_product_info_detail_desc")] public string SubProductInfoDetailDesc { get; set; } /// /// 明细排序号(子表字段)。 /// [SugarColumn(ColumnName = "sub_product_info_detail_order")] public long? SubProductInfoDetailOrder { get; set; } /// /// 明细图片URL(子表字段)。 /// [SugarColumn(ColumnName = "sub_product_info_detail_pic")] public string SubProductInfoDetailPic { get; set; } /// /// 明细祖级列表(子表字段)。 /// [SugarColumn(ColumnName = "sub_ancestors")] public string SubAncestors { get; set; } /// /// 明细创建时间(子表字段)。 /// [SugarColumn(ColumnName = "sub_create_time")] public DateTime? SubCreateTime { get; set; } /// /// 明细创建人(子表字段)。 /// [SugarColumn(ColumnName = "sub_create_by")] public string SubCreateBy { get; set; } /// /// 明细更新时间(子表字段)。 /// [SugarColumn(ColumnName = "sub_update_time")] public DateTime? SubUpdateTime { get; set; } /// /// 明细更新人(子表字段)。 /// [SugarColumn(ColumnName = "sub_update_by")] public string SubUpdateBy { get; set; } }