9.5、查询操作
数据查询是应用系统中最常用的操作,几乎覆盖了80%的代码。
特别说明
该章节中所有集合查询并不会真正的执行数据库查询,如若拷贝代码进去程序中,必须手动调用 .ToList() 方法才会做真正的数据库查询操作。🤣😂😎
如果当前方法只做查询作用,建议所有的 DbSet 或 IQueryable<TEntity> 对象都带上 .AsNoTracking(),可以提高查询性能。相关文档说明
_testRepository.Entity.AsNoTracking();查询所有数据
无查询条件
// 方式一,推荐
_testRepository.Entity;
// 方式二
_testRepository.GetAll();
// 方式三
from u in _testRepository.Entity
select u;有条件查询
根据值是否有效构建查询
WhereIf 相比 Where 多了一个参数,就是判断这个参数是否有效,如果有效才新增条件进行查询。
条件拼接高级用法
Hoa Framework 中提供了一些高级拼接条件的方法,有:
WhereIf:如果第一个参数为true才构建查询表达式WhereOr:支持or连接表达式WhereIfOr:如果第一个参数为true,才构建or连接表达式
WhereIf 使用
上述生成的sql条件全部采用 and 连接。
WhereOr 使用
在 WhereOr 表达式中的集合生成的 sql全部会采用 or 连接操作。
WhereIfOr 使用
WhereIfOr 就是 WhereIf 和 WhereOr 的结合版。
一次性拼接好添加再查询
框架还提供一种更灵活的方式拼接 Where 条件
还可以创建一个 表达式池,也就是给定初始化值再随意拼接
关于 LinqBuilder.Pool<T> 用法
LinqBuilder.Pool<T> 用法LinqBuilder.Pool<T> 是构建一个临时条件池,可重复构建。例如,我需要剩下如下 sql 条件
则可以这样写:
或用 WhereOr ,这种更简单
支持以下拼接表达式
AndAndIfOrOrIf
查询单条记录
根据主键Id查询
根据条件查询
分页查询
默认分页查询
配置更多分页条件
联表查询
有物理外键关系
有物理外键关系需要在主表和从表中配置相关的导航属性
配置代码大致如下:
使用
根据条件成立再连表
更多物理外键联表查询操作可查看EF Core 官方文档
无物理外键关系,存在逻辑外键
🏴 Inner Join
🏴 Left Join
Lamda 联表
更多关于 EF Core 复杂连表可查看官方文档。
性能问题
默认情况下,EF Core 不会加载关联数据,除非采用预先加载、显式加载或懒加载模式。但是如果调用 ProjectToType<>()方法之后,就变成了立即加载,这样会导致性能问题!
所以,如果没有关联实体的查询可以采用 ProjectToType<>()方式,否则采用 ToList().Adapt<>()方式。
原生SQL查询
在Hoa Framework v1.4.0 版本新增了 切面上下文功能,也就是下面的代码不再推荐使用,见 9.12、切面上下文(TangentDbContext)章节。
返回仓储实体对象
返回任意对象(非常强大)
查询记录是否存在
分组查询
常见分组
更多例子
多表联接分组
查询排序
正序
倒序
字符串排序
动态查询
字符串构建查询
支持Lambda空检查符号查询
高级用法,动态构建Lambda
动态Lambda 支持方法
AllAnyAverageCountFirstFirstOrDefaultGroupByGroupByManyGroupJoinJoinLastLastOrDefaultLongCountOfTypeOrderBySelectSelectManySingleSingleOrDefaultSumThenByWhere
复杂查询
Hoa Framework ORM框架支持复杂查询,包括联表、分组、排序、聚合、自定义函数组合等,如:
最终打印的 Sql 如下:
其他查询
查看记录数
求和
求平均值
查时间范围
模糊查询
🏴 以某字符串开头
🏴 以某字符串结尾
🏴 包含字符串
数据库Case When实现
数据库中的 Case When 实际上对应的是我们程序中的 三元表达式 ,也就是使用 三元表达式 即可自动生成 Case When 语句。
最后更新于
这有帮助吗?