怎样优雅地增删查改(五):按组织架构查询

这篇具有很好参考价值的文章主要介绍了怎样优雅地增删查改(五):按组织架构查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


之前我们实现了Employee,Alarm管理模块以及通用查询应用层。

Employee的集合查询业务,是通过重写CreateFilteredQueryAsync方法,来实现按组织架构查询的过滤条件。

我们将这段逻辑代码提取到通用查询应用层中,便可实现在任何业务的按组织架构查询。

原理

查询依据

在Abp中,组织架构和用户是通过中间表AbpUserOrganizationUnits实现多对多的关系。模型如下图所示:
怎样优雅地增删查改(五):按组织架构查询,架构,.NET,架构,微服务,asp.net,c#
查询目标业务对象HealthAlarm关联了业务用户HealthClient,因业务用户与鉴权用户IdentityUser共享同一个Id,因此可以通过查询组织架构关联的User,查询到业务对象。
怎样优雅地增删查改(五):按组织架构查询,架构,.NET,架构,微服务,asp.net,c#

通过LINQ查询

EmployeeAppService中,CreateFilteredQueryAsync方法组织架构的过滤条件代码如下:

var organizationUnitUsers = await organizationUnitAppService.GetOrganizationUnitUsersAsync(new GetOrganizationUnitUsersInput()
{
    Id = input.OrganizationUnitId.Value
});
if (organizationUnitUsers.Count() > 0)
{
    var ids = organizationUnitUsers.Select(c => c.Id);
    query = query.Where(t => ids.Contains(t.Id));
}
else
{
    query = query.Where(c => false);
}

通过反射和动态Lambda表达式查询

CreateFilteredQueryAsync是通过业务用户的IRepository获取实体的IQueryable 然后通过query.Where()实现了按组织架构的过滤条件。

IQueryable是一泛型类接口,泛型参数是实体类。要想在任意实体实现Where的过滤条件,我们使用动态拼接语言集成查询 (LINQ) 的方式实现通用查询接口,有关LINQ表达式,请阅读 LINQ 教程和有关 Lambda 表达式的文章。

实现

定义按组织架构查询过滤器(IOrganizationOrientedFilter)接口,查询实体列表Dto若实现该接口,将筛选指定 OrganizationUnitId 下的用户关联的实体。

public interface IOrganizationOrientedFilter
{
    Guid? OrganizationUnitId { get; set; }
}

重写CreateFilteredQueryAsync方法,代码如下


protected override async Task<IQueryable<TEntity>> CreateFilteredQueryAsync(TGetListInput input)
{
    var query = await ReadOnlyRepository.GetQueryableAsync();

    query = await ApplyOrganizationOrientedFiltered(query,input);

    return query;
}

对于OrganizationUnit服务,其依赖关系在应用层,查找指定组织架构的用户将在CurdAppServiceBase的子类实现。创建一个抽象方法GetUserIdsByOrganizationAsync

protected abstract Task<IEnumerable<Guid>> GetUserIdsByOrganizationAsync(Guid organizationUnitId)

创建应用过滤条件方法:ApplyOrganizationOrientedFiltered,在此实现拼接LINQ表达式,代码如下:

protected virtual async Task<IQueryable<TEntity>> ApplyOrganizationOrientedFiltered(IQueryable<TEntity> query, TGetListInput input)
{
    if (input is IOrganizationOrientedFilter && HasProperty<TEntity>("UserId"))
    {
        var property = typeof(TEntity).GetProperty("UserId");
        var filteredInput = input as IOrganizationOrientedFilter;
        if (filteredInput != null && filteredInput.OrganizationUnitId.HasValue)
        {

            var ids = await GetUserIdsByOrganizationAsync(filteredInput.OrganizationUnitId.Value);
            Expression originalExpression = null;
            var parameter = Expression.Parameter(typeof(TEntity), "p");
            foreach (var id in ids)
            {
                var keyConstantExpression = Expression.Constant(id, typeof(Guid));
                var propertyAccess = Expression.MakeMemberAccess(parameter, property);
                var expressionSegment = Expression.Equal(propertyAccess, keyConstantExpression);

                if (originalExpression == null)
                {
                    originalExpression = expressionSegment;
                }
                else
                {
                    originalExpression = Expression.Or(originalExpression, expressionSegment);
                }
            }

            var equalExpression = originalExpression != null ?
                    Expression.Lambda<Func<TEntity, bool>>(originalExpression, parameter)
                    : p => false;

            query = query.Where(equalExpression);

        }

    }
    return query;
}

请注意,可应用过滤的条件为:

  1. input需实现IOrganizationOrientedFilter接口
  2. 实体必须包含UserId字段

否则将原封不动返回IQueryable对象。

应用

在上一章Alarm管理模块中,我们已经写好了AlarmAppService,我们需要为其实现GetUserIdsByOrganizationAsync方法。改造AlarmAppService代码如下:

public class AlarmAppService : ExtendedCurdAppServiceBase<Matoapp.Health.Alarm.Alarm, AlarmDto, AlarmDto, AlarmBriefDto, long, GetAllAlarmInput, GetAllAlarmInput, CreateAlarmInput, UpdateAlarmInput>, IAlarmAppService
{
    private readonly IOrganizationUnitAppService organizationUnitAppService;

    public AlarmAppService(
        IOrganizationUnitAppService organizationUnitAppService,
        IRepository<Matoapp.Health.Alarm.Alarm, long> basicInventoryRepository) : base(basicInventoryRepository)
    {
        this.organizationUnitAppService = organizationUnitAppService;
    }

    protected override async Task<IEnumerable<Guid>> GetUserIdsByOrganizationAsync(Guid organizationUnitId)
    {
        var organizationUnitUsers = await organizationUnitAppService.GetOrganizationUnitUsersAsync(new GetOrganizationUnitUsersInput()
        {
            Id = organizationUnitId
        });

        var ids = organizationUnitUsers.Select(c => c.Id);
        return ids;
    }
}

在GetAllAlarmInput中实现IOrganizationOrientedFilter接口,代码如下:

public class GetAllAlarmInput : PagedAndSortedResultRequestDto, IOrganizationOrientedFilter
{
	public Guid? OrganizationUnitId { get; set; }
    ...
}

测试

创建一些组织架构,命名“群组”

怎样优雅地增删查改(五):按组织架构查询,架构,.NET,架构,微服务,asp.net,c#

在不同“群组”下创建一些客户(Client)

怎样优雅地增删查改(五):按组织架构查询,架构,.NET,架构,微服务,asp.net,c#

怎样优雅地增删查改(五):按组织架构查询,架构,.NET,架构,微服务,asp.net,c#

在告警管理页面中,创建一些告警,并将这些告警分配给不同的客户

怎样优雅地增删查改(五):按组织架构查询,架构,.NET,架构,微服务,asp.net,c#

在客户管理中,通过选择不同的组织架构,查询当前“群组”下的客户告警

怎样优雅地增删查改(五):按组织架构查询,架构,.NET,架构,微服务,asp.net,c#
怎样优雅地增删查改(五):按组织架构查询,架构,.NET,架构,微服务,asp.net,c#文章来源地址https://www.toymoban.com/news/detail-558836.html

到了这里,关于怎样优雅地增删查改(五):按组织架构查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ruoyi若依 组织架构设计--[ 菜单管理 ]

    1.部门表 ancestors 字段。 添加这个字段, 方便列举所有子部门 2.用户信息表 添加dept_id。用于根据 部门树 ,查询所有的用户。另一方面,也是可以做 数据权限 3.岗位表 4.角色表 5.菜单表 6.用户角色关联表 7.角色菜单关联表 8.角色部门关联表 9.用户岗位关联表 需求是 超级管理

    2024年02月12日
    浏览(37)
  • [架构之路-243]:目标系统 - 纵向分层 - 架构是表面轮廓、内部骨架、未来蓝图,企业组织架构、信息系统架构、软件架构、应用程序就架构

    目录 一、什么是架构 1.1 架构是表面轮廓 1.2 架构是内部骨架 1.3 架构是蓝图,是愿景 1.4 架构是数据流、控制流、管理流、同步流 1.5 数据、控制、同步、管理的比较 二、架构的层级 2.1 企业组织架构 2.2 企业系统架构 2.2 信息系统架构 2.3 软件架构 2.4 应用程序的架构 三、软

    2024年02月08日
    浏览(42)
  • 如何在Microsoft Word中制作组织架构图

    如果要说明公司或组织中的报告关系,可以创建一个使用组织结构图布局的 SmartArt 图形,如组织结构图。 注意:绘制组织结构图的另一种方法是使用 Microsoft 绘图应用程序 Visio。 使用 SmartArt 图形在 Excel、Outlook、PowerPoint 或 Word 中创建组织结构图,以显示组织中的报告关

    2024年02月12日
    浏览(20)
  • 软件测试基础(五) 之 了解测试团队的组织架构

    今天来了解一下软件测试团队的组织架构模式到底是什么样子。   一个公司软件测试的组织架构,可能会决定你未来的成长空间,同时也决定了我们的工作模式到底是什么样子。   现在测试行业内通常测试团队的组织架构主要分成两种, 一种叫做金字塔式管理模式,一

    2024年02月07日
    浏览(33)
  • 阿里组织架构迎来巨变!拆分为六大业务,或可分别独立上市

    “1+6+N”组织调整是阿里巴巴“24年来最重要的一次组织变革”,六大业务集团及业务公司可以独立融资或独立上市,意味着阿里的整体估值将得到大幅提升。 马云回国、阿里巴巴宣布启动“1+6+N”组织调整、具备条件的业务集团和公司将独立上市……一系列有关阿里的消息在

    2024年02月06日
    浏览(51)
  • 钉钉企业内部机器人开发——同步组织架构人员信息到数据库

    开发钉钉机器人的过程中,我们不仅需要直接把组织架构用户信息导入数据库,还要不定时的进行同步,因为钉钉里面的人员总是在变动,部门也是不断在调整。 下面是使用递归的方式,调用钉钉接口,同步部门和人员信息,没有的创建,多余的删除

    2024年02月11日
    浏览(35)
  • 汇编语言第一讲:计算机的组织架构和汇编语言介绍

    第一讲:计算机的组织架构和汇编语言介绍 汇编语言 计算机组织架构 数字电路 术语回顾 数制 数字电路 硬件电路 数字电路的问题 汇编语言的开始 程序的节(sections) 调用操作系统的系统调用 列出文件(Listing files) 汇编和链接 调试汇编程序 反汇编现有的程序 附录 课程资源

    2024年04月09日
    浏览(38)
  • PMP组织架构分类(强矩阵弱矩阵等)及项目经理权力与职能经理对比,一看必懂

    PMP组织架构中一般分类 :职能型,项目型,矩阵型(包括弱矩阵型、强矩阵型、平衡型矩阵)。 先重点来说说弱/强 矩阵型: 矩阵型划分强弱矩阵(事务急迫与难度): 弱矩阵: 一般为较简单或不紧急的项目 强矩阵: 一般为较复杂或较紧急的项目 平衡矩阵: 各方面都相对

    2024年02月06日
    浏览(43)
  • Go-Ldap-Admin | openLDAP 同步钉钉、企业微信、飞书组织架构实践和部分小坑

    目录 一、Docker-compose快速拉起demo测试环境 二、原生部署流程 安装MySQL:5.7数据库 安装openLDAP 修改域名,新增con.ldif 创建一个组织 安装OpenResty 下载后端 下载前端 部署后端 部署前端 三、管理动态字段 钉钉 企业微信 飞书 四、部分报错 Go-Ldap-Admin官网:Go-Ldap-Admin 本文用于记

    2024年02月07日
    浏览(34)
  • 【数据库】树形数据组织架构下的封锁并发控制,B树索引并发访问控制,树协议原理及案例分析

    ​ 专栏内容 : 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便阶段学

    2024年02月04日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包