C#开发自学记录02-1 控制器相关文件
今天本来是想直接修改01里面字段,比如尝试直接复制一段代码,然后像改个“月份2”什么的试一下效果,结果复制哪个都没反应,直到某报错跳转到控制器编辑的代码才发现,构建实体只是其中一步而已。
但我今天莫名很懒,所以先不研究了——25/7/31.
好的,我回来了,今天继续研究控制器的cs文件,这个文件代码更多更杂啊。
开头就引用了更多的suing,引用了各种不同的 .NET 库 和 自定义命名空间,主要用于 Excel 操作(NPOI)、业务逻辑和基础系统功能(System)。
1、 public class E : DomainController
这里也是我们在01看过的了,定义了E继承自DomainController的一些功能,这个一般是用于封装通用的领域逻辑(如数据访问、权限校验),或者就是协调领域层(DDD)和应用层的控制器。
注:E代表着某个命名字段,前面ABCD同理。
2、 public virtual EntityList<C> GetListByCriteria(F f)
EntityList<C>:自定义的某个泛型集合类,用于包装实体,这里我查了下是用来查询或设置实体位置。C就是某个静态字段;F是封装查询条件的对象;
GetListByCriteria是某个封装查询条件的对象;
这一整句代码的作用是 声明一个公开的虚方法,用于 根据指定的查询条件(f)动态获取所查结果静态数据(C)的列表,并返回一个封装了分页或附加信息的集合对象(EntityList<C> )。
3、var begin = Convert.ToDateTime(criteria.Month.Value.Year.ToString() + "-" + criteria.Month.Value.Month.ToString() + "-01");
获取 criteria.Month(某个日期)的年份和月份,拼接成该月的第一天(格式如 "2023-08-01"),并转换为 DateTime 类型。
Convert用于数据类型的转换,在C#中,Convert.ToDateTime方法用于将指定的字符串表示形式转换为等效的日期和时间值;
若 criteria.Month.Value = 2023-08-15 → 生成 begin = 2023-08-01(8月1日)
注意:criteria.Month 应为 DateTime? 类型(因为用了 .Value)。
这里也可以简化为var begin = new Date Time(criteria.Month.Value.Year,criteria.Month.Value.Month, 1);
4、var end = Convert.ToDateTime(criteria.Month.Value.AddMonths(1).Year.ToString() + "-" + criteria.Month.Value.AddMonths(1).Month.ToString() + "-01");
获取 criteria.Month 下个月的第一天(即当前月的最后一天+1天),用于定义查询范围的截止时间。若 criteria.Month.Value = 2023-08-15 → 生成 end = 2023-09-01(9月1日)
实际查询时会用 < end,因此范围是 左闭右开区间 [begin, end),即包含8月整月数据。
查询资料有建议改用 new DateTime 构造:
var end = begin.AddMonths(1); // 更简洁且避免时区问题
说实话,我也觉得原代码写得有点杂了,就是实现一个按月份查询的功能,改成上面那句也能正常运行。
5、var query = Query<SCWPDetail>() .Where(p => (p.SCWP.Status == NCS.Inspectioned || p.SCWP.Status == NCS.Inspecting));
作用:查询 SCWPDetail表,筛选关联的 SCWP状态为 已检查(Inspectioned) 或 检查中(Inspecting) 的记录。
这里的Query<T>是自定义的查询,其主要作用是提供一个统一的入口点,来创建指定实体类型 T的查询数据库的对象。定义中有virtual允许子类重写查询逻辑,这个方法是领域驱动设计(DDD)中典型的仓储模式实现,为上层提供简洁、安全的数据库查询入口,同时保持扩展灵活性。
NCS是自定义的是枚举类型,表示不同的状态。
6、query.Where(p => p.SCWP.UpdateDate >= begin && p.SCWP.UpdateDate < end);
p.SCWP.UpdateDate.updateDate就是该表里更新的时间字段;
7、 if (criteria.AnaProjectsId != null)
{
query.Where(p => p.SPCM.AnaProjectsId == criteria.AnaProjectsId);
}
这里其实就是当项目ID不为空(外键)时,筛选表里该项目对应的单子。这里和上面补充起来有两个where,多次Where会合并为AND条件;但如果是某些自定义查询器可能不会自动合并,所以可以试着用条件链,即第二个where换成.whereIf。
PS:我之前一直不清楚SQL语句和C#代码有什么关系,所以我去查了一下,就是 ORM技术(对象关系映射,只能翻译数据库支持的操作)会根据你写的代码,像where什么的转化为分析表达式树,再按照规则翻译成SQL.
这篇先写到这里吧。
更多推荐
所有评论(0)