9.5、查询操作

数据查询是应用系统中最常用的操作,几乎覆盖了80%的代码。

特别说明

该章节中所有集合查询并不会真正的执行数据库查询,如若拷贝代码进去程序中,必须手动调用 .ToList() 方法才会做真正的数据库查询操作。🤣😂😎

如果当前方法只做查询作用,建议所有的 DbSetIQueryable<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 就是 WhereIfWhereOr 的结合版。

一次性拼接好添加再查询

框架还提供一种更灵活的方式拼接 Where 条件

还可以创建一个 表达式池,也就是给定初始化值再随意拼接

关于 LinqBuilder.Pool<T> 用法

LinqBuilder.Pool<T> 是构建一个临时条件池,可重复构建。例如,我需要剩下如下 sql 条件

则可以这样写:

或用 WhereOr ,这种更简单

支持以下拼接表达式

  • And

  • AndIf

  • Or

  • OrIf

查询单条记录

根据主键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 支持方法

  • All

  • Any

  • Average

  • Count

  • First

  • FirstOrDefault

  • GroupBy

  • GroupByMany

  • GroupJoin

  • Join

  • Last

  • LastOrDefault

  • LongCount

  • OfType

  • OrderBy

  • Select

  • SelectMany

  • Single

  • SingleOrDefault

  • Sum

  • ThenBy

  • Where

复杂查询

Hoa Framework ORM框架支持复杂查询,包括联表、分组、排序、聚合、自定义函数组合等,如:

最终打印的 Sql 如下:

其他查询

查看记录数

求和

求平均值

查时间范围

模糊查询

🏴 以某字符串开头

🏴 以某字符串结尾

🏴 包含字符串

数据库Case When实现

数据库中的 Case When 实际上对应的是我们程序中的 三元表达式 ,也就是使用 三元表达式 即可自动生成 Case When 语句。

最后更新于

这有帮助吗?