Show / Hide Table of Contents

    复合查询教程

    以下教程演示了如何创建和使用复合查询模型。

    准备数据源

    本教程将使用实体作为数据源来创建复合查询模型。

    本教程将使用以下三个标准实体:Company、Department、Employee,您可以直接从以下演示应用程序中获取:https://github.com/Aipuyang/LowCode-WorkForceManager-CNExample,或者参阅 Code First 开发教程 或 DB First 开发教程 学习如何从零开始创建实体。

    • Company 实体包含以下字段:CompanyName、Contactor、CompanySize、EmployeeList、EmployeeCount、Address(以及从 BaseEntity 继承的 Id 等字段)。

      image-20240621162719045

    • Department 实体包含以下字段:DepartmentName、Company、SuperiorDepartment(以及从 SoftDelete 继承的 IsDeleted 等字段)。

      image-20240621162838325

    • Employee 实体包含以下字段:FirstName、LastName、FullName、Gender、PhoneNumber、HireDate、TrialMonths、IsTrial、Department、Company、Manager、IsManager、Address(以及从 BaseEntity 继承的 Id 等字段)。

      image-20240621162911470

    如果您已下载演示应用程序,可以打开 Entities > Company.sde、Department.sde 和 Employee.sde 文件查看。

    创建查询模型

    右键单击项目或文件夹并选择 添加 > 新建项。

    image-20240607093630025

    选择 复合查询设计,指定文件名称,点击 下一步。

    image-20240607093752547

    选择实体作为数据源:Company、Department、Employee。点击 创建。

    image-20240607094118018

    复合查询设计器将会自动打开。

    image-20240607094218098

    复合查询设计器 包含 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 字段。

    1. 在 关系 设计面板中,点击 Company 实体的 Id 字段后长按并拖动鼠标到 Employee 实体的 CompanyId 字段。两个字段间将自动绘制一条连接线。 关系设置 标签页中也会自动同步添加对应关系。
    2. 在 关系设置 标签页中修改连接方式为 Left Join。

    第三步:配置分组

    按公司ID、公司名称、以及员工性别分组。

    1. 在 分组设置 标签页中,点击 添加分组。选择 Company 实体的 Id 字段作为分组字段。
    2. 用同样方式继续添加 Company 实体的 CompanyName 字段、以及 Employee 实体的 Gender 字段作为分组字段。

    image-20240611130854289

    第四步:配置结果集

    分组字段会自动添加到 结果集字段 标签页中。除了自动添加的分组字段,还需要添加以下几个字段用来输出结果:

    1. 在 结果集字段 标签页中,点击 添加字段,指定名称为:CountNumber,显示名称为:人数,配置 值(映射) 为以下表达式:

      Count(CompanyCount.Group.Employee.Id) 
      

      按照不同的公司和不同的性别来统计人数(比如,A公司的男员工人数,A公司的女员工人数,B公司的男员工人数,B公司的女员工人数)。

    2. 继续添加字段,名称为: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) 可以过滤掉空值,不统计在内。

    3. 继续添加字段,名称为:Percentage,显示名称为:人数占比,配置 值(映射) 为以下表达式:

      CompanyCount.CountNumber * 1.0 / CompanyCount.TotalNumber * 100.0 + "%"
      

      按照各个公司的人数和所有公司的总人数来统计人数占比(比如,A公司人数占总人数的比例,B公司人数占总人数的比例)。

    第五步:配置服务与API

    添加服务与 API,例如 GetListByNoFilter。

    image-20240621170618096

    查询名字

    查询员工的名字、公司名和部门名。

    image-20240611160144907

    第一步:选择数据源

    点击 关系 设计面板右上角的 添加数据源,选择 Company、Department、Employee 实体作为数据源。

    Company、Department 和 Employee 实体显示在 关系 设计面板中。

    第二步:配置关系

    以 Left Join 方式连接 Company 实体的 Id 字段和 Department 实体的 CompanyId 字段,以及 Department 实体的 Id 字段和 Employee 实体的 DepartmentId 字段。

    1. 在 关系 设计面板中,点击 Company 实体的 Id 字段后长按并拖动鼠标到 Department 实体的 CompanyId 字段。然后点击 Department 实体的 Id 字段后长按并拖动鼠标到 Employee 实体的 DepartmentId 字段。字段间将自动绘制连接线。 关系设置 标签页中也会自动同步添加对应关系。
    2. 在 关系设置 标签页中修改连接方式为 Left Join。

    第三步:配置结果集

    添加以下字段来输出结果:

    1. 在 结果集字段 标签页中,点击 添加字段,指定名称为:CompanyName,显示名称为:公司名,配置 值(映射) 为字段:Company 实体的 CompanyName字段。

    2. 继续添加字段,指定名称为:DepartmentName,显示名称为:部门名,配置 值(映射) 为字段:Department 实体的 DepartmentName 字段。

    3. 继续添加字段,指定名称为:EmployeeName,显示名称为:员工名,配置 值(映射) 为表达式:

      Employee.FirstName + Employee.LastName  
      

    第四步:配置过滤器

    如果需要的话,可以添加如下过滤器。

    image-20240611160144907

    第五步:配置服务与API

    添加服务与API,例如:GetListByFilter、GetListByNoFilter。

    image-20240624094502840

    按年限统计人数

    按工作年限统计员工人数。我们将通过表达式来动态分组,通过表达式计算入职年限,来动态统计不同工作年限(“5年以下”,“5-10年”,以及“10年以上”)的人数分别是多少。

    image-20240611141725414

    第一步:选择数据源

    点击 关系 设计面板右上角的 添加数据源,选择 Company、Department、Employee 实体作为数据源。

    Company、Department 和 Employee 实体显示在 关系 设计面板中。

    第二步:配置关系

    以 Left Join 方式连接 Company 实体的 Id 字段和 Department 实体的 CompanyId 字段,以及 Department 实体的 Id 字段和 Employee 实体的 DepartmentId 字段。

    1. 在 关系 设计面板中,点击 Company 实体的 Id 字段后长按并拖动鼠标到 Department 实体的 CompanyId 字段。然后点击 Department 实体的 Id 字段后长按并拖动鼠标到 Employee 实体的 DepartmentId 字段。字段间将自动绘制连接线。 关系设置 标签页中也会自动同步添加对应关系。
    2. 在 关系设置 标签页中修改连接方式为 Left Join。

    第三步:配置分组

    按公司ID、部门ID、公司名称、部门名称、以及工作年限分组。其中工作年限按“5年以下”,“5-10年”,以及“10年以上”三个条件来分组,通过表达式来实现。

    1. 在 分组设置 标签页中,点击 添加分组。选择 Company 实体的 id 字段作为分组字段。

    2. 继续添加 Department 实体的 id 字段、Company 实体的 CompanyName 字段、 Department 实体的 DepartmentName 字段。

    3. 最后,添加表达式按“5年以下”,“5-10年”,以及“10年以上”三个工作年限来分组:

      If(DateDif(Employee.HireDate,Now(),'Y')<5,'5年以下', If(DateDif(Employee.HireDate, Now(),'Y')<10,'5-10年','10年以上')) 
      

    第四步:配置结果集

    分组字段会自动添加到 结果集字段 标签页中。除了自动添加的分组字段,还可以添加以下字段来输出结果:

    1. 在 结果集字段 标签页中,点击 添加字段,指定名称为:CountNumber,显示名称为:数量,配置 值(映射) 为以下表达式(用于统计三个工作年限的员工人数):

      Count(WorkTimeCount.Group.Employee) 
      

    第五步:配置服务与API

    添加服务与API,例如 GetListByNoFilter。

    image-20240624094556194

    查询直接下属

    查询所有员工的直接下属。

    注意:组长和下属在同一个表,因此通过自关联查询出下属,然后按照组长ID和名字进行分类就可以查询出所有组长的下属。

    用 Left Join 会包含空值,因此配置过滤器筛选掉没有下属的员工,Leader 表就会只显示组长。

    image-20240611144813845

    第一步:选择数据源

    点击 关系 设计面板右上角的 添加数据源,选择 Company 和 Employee 实体作为数据源。注意:其中 Employee 实体需要添加两次,分别作为 组长 和 组员 的数据源。

    Company、Employee(即将改名为 Leader)和 Employee 实体显示在 关系 设计面板中。

    将其中一个 Employee 实体改名为 Leader,作为组长的数据源,另一个 Employee 实体保持名字不变,作为组员的数据源。注意:后面我们会通过过滤器将 Leader 实体数据源中不是组长的数据过滤掉。

    第二步:配置关系

    以 Left Join 方式连接 Company 实体的 Id 字段和 Leader 实体的 CompanyId 字段,以及 Leader 实体的 Id 字段和 Employee 实体的 ManagerId 字段。

    1. 在 关系 设计面板中,点击 Company 实体的 Id 字段后长按并拖动鼠标到 Leader 实体的 CompanyId 字段。然后点击 Leader 实体的 Id 字段后长按并拖动鼠标到 Employee 实体的 ManagerId 字段。字段间将自动绘制连接线。 关系设置 标签页中也会自动同步添加对应关系。
    2. 在 关系设置 标签页中修改连接方式为 Left Join。

    第三步:配置分组

    按公司ID、公司名称、组长ID、以及组长名字分组。

    1. 在 分组设置 标签页中,点击 添加分组。选择 Company 实体的 id 字段作为分组字段。

    2. 继续添加 Company 实体的 CompanyName 字段以及 Leader 实体的 Id 字段。

    3. 最后,添加以下表达式实现按组长名字来分组:

      Leader.FirstName + Leader.LastName
      

    第四步:配置结果集

    分组字段会自动添加到 结果集字段 标签页中。除了自动添加的分组字段,还需要添加以下字段用来输出下属的名字:

    1. 在 结果集字段 标签页中,点击 添加字段,指定名称为:Subordinate,显示名称为:下属,配置 值(映射) 为以下表达式(用 Select 查询集合):

      Select(CountEmployeeSubordinate.Group.Employee.FirstName + CountEmployeeSubordinate.Group.Employee.LastName)
      

    第五步:配置过滤器

    配置过滤器。将 Leader 数据源中不是组长的数据过滤掉。

    image-20240611160218354

    第六步:配置服务与API

    添加服务与API,例如 GetListByManagerFilter。

    image-20240624094708480

    生成并运行项目

    具体操作方式,请参考 这个小节。

    返回顶部