Rafy 框架 - 通用查询条件(CommonQueryCriteria)

简介:  在应用开发过程中,有 80% 的场景下,开发者所需要的实体查询,查询条件中其实都是一些简单的属性匹配,又或是一些属性匹配的简单组合。Rafy 为这样的场景提供了更为方便使用的 API:CommonQueryCriteria。

 

在应用开发过程中,有 80% 的场景下,开发者所需要的实体查询,查询条件中其实都是一些简单的属性匹配,又或是一些属性匹配的简单组合。Rafy 为这样的场景提供了更为方便使用的 API:CommonQueryCriteria。

 

属性匹配


在查询时,当需要使用一个或几个属性的限定匹配来进行查询时,我们可以通过 CommonQueryCriteria 来使用以下方法进行快速查询。例如,以下查询实现了通过用户的编码的精确匹配来查询唯一指定的用户:

C#

public User GetByCode(string code)
{
    return this.GetFirstBy(new CommonQueryCriteria
    {
        new PropertyMatch(User.CodeProperty, PropertyOperator.Equal, code)
    });
}

例如,以下查询实现同时通过用户名称的模糊匹配、年龄的精确匹配来查询一组用户(由于 Age 未指定 PropertyOperator,所以使用的是 Equal):

C#

public UserList GetByNameAge(string name, int age)
{
    return this.GetBy(new CommonQueryCriteria
    {
        new PropertyMatch(User.NameProperty, PropertyOperator.Contains, name),
        new PropertyMatch(User.AgeProperty, age)
    });
}

上述查询默认使用 And 进行多条件的连接。如果需要修改,可以通过 CommonQueryCriteria 的构造器传入或属性进行设置。

PropertyOperator 表示属性匹配的方式,可用的操作有:

  • Equal

  • NotEqual

  • Greater

  • GreaterEqual

  • Less

  • LessEqual

  • Like

  • NotLike

  • Contains

  • NotContains

  • StartsWith

  • NotStartsWith

  • EndsWith

  • NotEndsWith

  • In

  • NotIn

 

Note Note

为了方便开发者使用 CommonQueryCriteria,RafySDK 提供了代码段 RafyQuery_Common 来生成上述代码。

 

使用多个属性匹配组进行查询


上面是比较简单的查询,只是对单个属性或使用 And、Or 连接的几个条件进行匹配。我们还可以通过属性匹配组来实现相对复杂的查询。

一个 CommonQueryCriteria 中可以通过 And、Or 连接多个属性匹配组,而每一个属性匹配组也可以通过 And、Or 连接多个具体的属性匹配条件。

下面的代码演示了如何使用('Name contains name' And 'Age equal age' Or 'Code equal code')的条件进行查询:

C#

this.GetBy(new CommonQueryCriteria(BinaryOperator.Or)
{
    new PropertyMatchGroup
    {
        new PropertyMatch(TestUser.NameProperty, PropertyOperator.Contains, name)
        new PropertyMatch(TestUser.AgeProperty, age)
    },
    new PropertyMatchGroup
    {
        new PropertyMatch(TestUser.CodeProperty, code)
    }
});
 

相对于 Linq 查询的优势


使用 CommonQueryCriteria 进行查询时,相对于 Linq 查询 而言,有以下的优势:

  • 更加方便、简单

    仓库类型上已经提供了参数是 CommonQueryCriteria 的公有查询方法,开发可以直接使用这些方法进行查询,没有必要再封装一个相应的公有方法。

    例如,上面的示例中,也可以不封装 GetByCode 方法,而是由仓库的调用者直接使用 GetBy(CommonQueryCriteria) 方法。

  • 性能更好

    使用 Linq 查询时,编译器会使用反射生成表达式树,然后 Rafy 框架才会解析这棵树,生成最终的 Sql 树。但是使用 CommonQueryCriteria 通用查询时,Rafy 框架会直接将 CommonQueryCriteria 中的条件生成对应的 Sql 树,这就节省了表达式树的生成和解析的环节,提升了性能。

 

PS:该文已经纳入《Rafy 用户手册》中。

目录
相关文章
|
12天前
|
存储 NoSQL 数据处理
组合和继承怎么集成一个性能较好的项目
组合与继承是面向对象编程的核心概念,前者通过对象间关联实现高效解耦,后者则重用代码以节省空间和内存。组合常用于现代项目,利用代理与依赖注入简化代码管理;而继承简化了子模块对父模块资源的应用,但修改会影响整体。随着分层解耦及微服务架构如SpringCloud的出现,这些技术进一步优化了数据处理效率和服务响应性能,尤其在分布式存储与高并发场景下。同步异步调用、Redis分布式应用等也广泛运用组合与继承,实现代码和内存空间的有效复用。
|
1月前
|
存储 开发框架 前端开发
EAV模型(实体-属性-值)的设计和低代码的处理方案(2)--数据的查询处理
EAV模型(实体-属性-值)的设计和低代码的处理方案(2)--数据的查询处理
dapper通用分页方法
dapper通用分页方法
142 0
|
存储 XML SQL
Activiti工作流框架学习笔记(一)之通用数据表详细介绍
Activiti工作流框架学习笔记(一)之通用数据表详细介绍
421 1
|
缓存 自然语言处理 Swift
本周推荐 | 表达式引擎的组合子实现方案
推荐语:本文清晰而详细地介绍了如何使用 Parser 组合子方案,结合 Monad 通过合理的分层、抽象和组合,在性能达标的情况下实现消息场景中函数式的表达式解析。非常具有实践意义,推荐阅读学习! ——大淘宝技术终端开发工程师 闲行
240 0
本周推荐 | 表达式引擎的组合子实现方案
|
Dubbo NoSQL Java
架构:第八章:查询的资料
架构:第八章:查询的资料
【自然框架】之通用权限(八):权限到字段(列表、表单、查询)
 通用权限想要写的文章目录:(这是第八章)   1、 简介、数据库的总体结构2、 介绍人员表组3、 介绍组织结构表组4、 介绍角色表组5、 介绍“项目自我描述表组”6、 权限到节点7、 权限到按钮8、 权限到列表(表单、查询)9、 权限的验证10、 资源方面的权限11、 角色管理的程序(给客户用的)12、 权限下放13、 个性化设置A、 【自然框架】之通用权限(外传):杂谈     列表 myGrid 先说一下myGrid,我会根据Manage_FunListCol表和Manage_Columns表的内容,绘制出来一个table,就是的HTML。
905 0
SAP CRM产品搜索支持的标准搜索条件的渲染逻辑
Created by Jerry Wang, last modified on Oct 02, 2016
5942 0
SAP CRM产品搜索支持的标准搜索条件的渲染逻辑
|
数据库
【自然框架】之通用权限:数据库设计的几种使用方式
      上次《【自然框架】之通用权限:用PowerDesigner重新设计了一下数据库,有ER图和表关系图 》里说了一大堆的表,好多人说太复杂了,做到权限到模块就可以了。       这个嘛,我也没有说所有的表都要一起使用呀。
1202 0
|
搜索推荐 数据库
【自然框架】之通用权限(五):项目描述表组
      继续,这是第五章了。我发现了,写文章比写程序还要有难度。   通用权限想要写的文章目录:(这是第五章)    1、 简介、数据库的总体结构2、 介绍人员表组3、 介绍组织结构表组4、 介绍角色表组5、 介绍“项目自我描述表组”6、 权限到节点7、 权限到按钮8、 权限到列...
1109 0