复合查询教程
以下教程演示了如何创建和使用复合查询模型。
准备数据源
本教程将使用实体作为数据源来创建复合查询模型。
本教程将使用以下三个标准实体:Company、Department、Employee,您可以直接从以下演示应用程序中获取:https://github.com/Aipuyang/LowCode-WorkForceManager-CNExample,或者参阅 Code First 开发教程 或 DB First 开发教程 学习如何从零开始创建实体。
Company 实体包含以下字段:CompanyName、Contactor、CompanySize、EmployeeList、EmployeeCount、Address(以及从 BaseEntity 继承的 Id 等字段)。
Department 实体包含以下字段:DepartmentName、Company、SuperiorDepartment(以及从 SoftDelete 继承的 IsDeleted 等字段)。
Employee 实体包含以下字段:FirstName、LastName、FullName、Gender、PhoneNumber、HireDate、TrialMonths、IsTrial、Department、Company、Manager、IsManager、Address(以及从 BaseEntity 继承的 Id 等字段)。
如果您已下载演示应用程序,可以打开 Entities > Company.sde、Department.sde 和 Employee.sde 文件查看。
创建查询模型
右键单击项目或文件夹并选择 添加 > 新建项。
选择 复合查询设计,指定文件名称,点击 下一步。
选择实体作为数据源:Company、Department、Employee。点击 创建。
复合查询设计器将会自动打开。
复合查询设计器 包含 4 个选项卡:字段设计、 过滤器设计、服务与 API 设计 以及 代码预览。 字段设计 选项卡包含字段的设置(例如:关系、分组、结果集等);过滤器设计 选项卡包含数据过滤器和条件的设置; 服务和 API 设计 选项卡指定要生成的服务和 API; 代码预览 选项卡允许您以不同模式(按类别或按目标)查看自动生成的 C# 代码。
下面我们通过几个常见场景来演示如何使用 复合查询设计器。
统计人数
下面我们将按性别统计各个公司的男女员工人数,按公司统计总人数和各公司人数占比,设计思路如下:
1)按照不同的公司和不同的性别来统计人数(比如,A公司的男员工人数,A公司的女员工人数,B公司的男员工人数,B公司的女员工人数),需要按公司和性别添加如下分组字段:Company.Id,Company.CompanyName 和 Employee.Gender,以及如下表达式:
Count(CompanyStatistics.Group.Employee.Id)
2)按照不同公司来统计各个公司的总人数(比如,统计A公司的总人数,B公司的总人数),需要添加如下表达式:
CountIf(CompanyStatistics.QueryItems.Employee, IsNotNull(CompanyStatistics.QueryItems.Employee) && CompanyStatistics.Group.Key.CompanyId == CompanyStatistics.QueryItems.Company.Id)
3)按照各个公司的人数和所有公司的总人数来统计人数占比(比如,A公司人数占总人数的比例,B公司人数占总人数的比例),需要添加如下表达式:
CompanyStatistics.CountNumber * 1.0 / CompanyStatistics.TotalNumber * 100.0 + "%"
第一步:选择数据源
点击 关系 设计面板右上角的 添加数据源,选择 Company 和 Employee 两个实体作为数据源。
Company 和 Employee 实体显示在 关系 设计面板中。
第二步:配置关系
以 Left Join 方式连接 Company 实体的 Id 字段和 Employee 实体的 CompanyId 字段。
- 在 关系 设计面板中,点击 Company 实体的 Id 字段后长按并拖动鼠标到 Employee 实体的 CompanyId 字段。两个字段间将自动绘制一条连接线。 关系设置 标签页中也会自动同步添加对应关系。
- 在 关系设置 标签页中修改连接方式为 Left Join。
第三步:配置分组
按公司ID、公司名称、以及员工性别分组。
- 在 分组设置 标签页中,点击 添加分组。选择 Company 实体的 Id 字段作为分组字段。
- 用同样方式继续添加 Company 实体的 CompanyName 字段、以及 Employee 实体的 Gender 字段作为分组字段。
第四步:配置结果集
分组字段会自动添加到 结果集字段 标签页中。除了自动添加的分组字段,还需要添加以下几个字段用来输出结果:
在 结果集字段 标签页中,点击 添加字段,指定名称为:CountNumber,显示名称为:人数,配置 值(映射) 为以下表达式:
Count(CompanyCount.Group.Employee.Id)
按照不同的公司和不同的性别来统计人数(比如,A公司的男员工人数,A公司的女员工人数,B公司的男员工人数,B公司的女员工人数)。
继续添加字段,名称为:TotalNumber,显示名称为:总人数,配置 值(映射) 为以下表达式:
CountIf(CompanyCount.QueryItems.Employee , IsNotNull(CompanyCount.QueryItems.Employee) && CompanyCount.QueryItems.Company.CompanyName == CompanyCount.Group.Key.CompanyCompanyName)
按照不同公司来统计各个公司的总人数(比如,统计A公司的总人数,B公司的员工总人数)。
CompanyStatistics.QueryItems.Employee 是所有公司的总人数。
CompanyStatistics.Group.Key.CompanyId == CompanyStatistics.QueryItems.Company.Id 是各个公司的总人数。
IsNotNull(CompanyStatistics.QueryItems.Employee) 可以过滤掉空值,不统计在内。
继续添加字段,名称为:Percentage,显示名称为:人数占比,配置 值(映射) 为以下表达式:
CompanyCount.CountNumber * 1.0 / CompanyCount.TotalNumber * 100.0 + "%"
按照各个公司的人数和所有公司的总人数来统计人数占比(比如,A公司人数占总人数的比例,B公司人数占总人数的比例)。
第五步:配置服务与API
添加服务与 API,例如 GetListByNoFilter。
查询名字
查询员工的名字、公司名和部门名。
第一步:选择数据源
点击 关系 设计面板右上角的 添加数据源,选择 Company、Department、Employee 实体作为数据源。
Company、Department 和 Employee 实体显示在 关系 设计面板中。
第二步:配置关系
以 Left Join 方式连接 Company 实体的 Id 字段和 Department 实体的 CompanyId 字段,以及 Department 实体的 Id 字段和 Employee 实体的 DepartmentId 字段。
- 在 关系 设计面板中,点击 Company 实体的 Id 字段后长按并拖动鼠标到 Department 实体的 CompanyId 字段。然后点击 Department 实体的 Id 字段后长按并拖动鼠标到 Employee 实体的 DepartmentId 字段。字段间将自动绘制连接线。 关系设置 标签页中也会自动同步添加对应关系。
- 在 关系设置 标签页中修改连接方式为 Left Join。
第三步:配置结果集
添加以下字段来输出结果:
在 结果集字段 标签页中,点击 添加字段,指定名称为:CompanyName,显示名称为:公司名,配置 值(映射) 为字段:Company 实体的 CompanyName字段。
继续添加字段,指定名称为:DepartmentName,显示名称为:部门名,配置 值(映射) 为字段:Department 实体的 DepartmentName 字段。
继续添加字段,指定名称为:EmployeeName,显示名称为:员工名,配置 值(映射) 为表达式:
Employee.FirstName + Employee.LastName
第四步:配置过滤器
如果需要的话,可以添加如下过滤器。
第五步:配置服务与API
添加服务与API,例如:GetListByFilter、GetListByNoFilter。
按年限统计人数
按工作年限统计员工人数。我们将通过表达式来动态分组,通过表达式计算入职年限,来动态统计不同工作年限(“5年以下”,“5-10年”,以及“10年以上”)的人数分别是多少。
第一步:选择数据源
点击 关系 设计面板右上角的 添加数据源,选择 Company、Department、Employee 实体作为数据源。
Company、Department 和 Employee 实体显示在 关系 设计面板中。
第二步:配置关系
以 Left Join 方式连接 Company 实体的 Id 字段和 Department 实体的 CompanyId 字段,以及 Department 实体的 Id 字段和 Employee 实体的 DepartmentId 字段。
- 在 关系 设计面板中,点击 Company 实体的 Id 字段后长按并拖动鼠标到 Department 实体的 CompanyId 字段。然后点击 Department 实体的 Id 字段后长按并拖动鼠标到 Employee 实体的 DepartmentId 字段。字段间将自动绘制连接线。 关系设置 标签页中也会自动同步添加对应关系。
- 在 关系设置 标签页中修改连接方式为 Left Join。
第三步:配置分组
按公司ID、部门ID、公司名称、部门名称、以及工作年限分组。其中工作年限按“5年以下”,“5-10年”,以及“10年以上”三个条件来分组,通过表达式来实现。
在 分组设置 标签页中,点击 添加分组。选择 Company 实体的 id 字段作为分组字段。
继续添加 Department 实体的 id 字段、Company 实体的 CompanyName 字段、 Department 实体的 DepartmentName 字段。
最后,添加表达式按“5年以下”,“5-10年”,以及“10年以上”三个工作年限来分组:
If(DateDif(Employee.HireDate,Now(),'Y')<5,'5年以下', If(DateDif(Employee.HireDate, Now(),'Y')<10,'5-10年','10年以上'))
第四步:配置结果集
分组字段会自动添加到 结果集字段 标签页中。除了自动添加的分组字段,还可以添加以下字段来输出结果:
在 结果集字段 标签页中,点击 添加字段,指定名称为:CountNumber,显示名称为:数量,配置 值(映射) 为以下表达式(用于统计三个工作年限的员工人数):
Count(WorkTimeCount.Group.Employee)
第五步:配置服务与API
添加服务与API,例如 GetListByNoFilter。
查询直接下属
查询所有员工的直接下属。
注意:组长和下属在同一个表,因此通过自关联查询出下属,然后按照组长ID和名字进行分类就可以查询出所有组长的下属。
用 Left Join 会包含空值,因此配置过滤器筛选掉没有下属的员工,Leader 表就会只显示组长。
第一步:选择数据源
点击 关系 设计面板右上角的 添加数据源,选择 Company 和 Employee 实体作为数据源。注意:其中 Employee 实体需要添加两次,分别作为 组长 和 组员 的数据源。
Company、Employee(即将改名为 Leader)和 Employee 实体显示在 关系 设计面板中。
将其中一个 Employee 实体改名为 Leader,作为组长的数据源,另一个 Employee 实体保持名字不变,作为组员的数据源。注意:后面我们会通过过滤器将 Leader 实体数据源中不是组长的数据过滤掉。
第二步:配置关系
以 Left Join 方式连接 Company 实体的 Id 字段和 Leader 实体的 CompanyId 字段,以及 Leader 实体的 Id 字段和 Employee 实体的 ManagerId 字段。
- 在 关系 设计面板中,点击 Company 实体的 Id 字段后长按并拖动鼠标到 Leader 实体的 CompanyId 字段。然后点击 Leader 实体的 Id 字段后长按并拖动鼠标到 Employee 实体的 ManagerId 字段。字段间将自动绘制连接线。 关系设置 标签页中也会自动同步添加对应关系。
- 在 关系设置 标签页中修改连接方式为 Left Join。
第三步:配置分组
按公司ID、公司名称、组长ID、以及组长名字分组。
在 分组设置 标签页中,点击 添加分组。选择 Company 实体的 id 字段作为分组字段。
继续添加 Company 实体的 CompanyName 字段以及 Leader 实体的 Id 字段。
最后,添加以下表达式实现按组长名字来分组:
Leader.FirstName + Leader.LastName
第四步:配置结果集
分组字段会自动添加到 结果集字段 标签页中。除了自动添加的分组字段,还需要添加以下字段用来输出下属的名字:
在 结果集字段 标签页中,点击 添加字段,指定名称为:Subordinate,显示名称为:下属,配置 值(映射) 为以下表达式(用 Select 查询集合):
Select(CountEmployeeSubordinate.Group.Employee.FirstName + CountEmployeeSubordinate.Group.Employee.LastName)
第五步:配置过滤器
配置过滤器。将 Leader 数据源中不是组长的数据过滤掉。
第六步:配置服务与API
添加服务与API,例如 GetListByManagerFilter。
生成并运行项目
具体操作方式,请参考 这个小节。