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 用户手册》中。

目录
相关文章
|
2月前
|
存储 NoSQL 数据处理
组合和继承怎么集成一个性能较好的项目
组合与继承是面向对象编程的核心概念,前者通过对象间关联实现高效解耦,后者则重用代码以节省空间和内存。组合常用于现代项目,利用代理与依赖注入简化代码管理;而继承简化了子模块对父模块资源的应用,但修改会影响整体。随着分层解耦及微服务架构如SpringCloud的出现,这些技术进一步优化了数据处理效率和服务响应性能,尤其在分布式存储与高并发场景下。同步异步调用、Redis分布式应用等也广泛运用组合与继承,实现代码和内存空间的有效复用。
|
3月前
|
存储 开发框架 前端开发
EAV模型(实体-属性-值)的设计和低代码的处理方案(2)--数据的查询处理
EAV模型(实体-属性-值)的设计和低代码的处理方案(2)--数据的查询处理
|
3月前
|
开发框架 .NET 数据库
全面掌握Entity Framework Core高级查询技巧:详解自定义函数与聚合函数的实现方法及应用场景,附带完整代码示例与最佳实践指导
【8月更文挑战第31天】在使用 Entity Framework Core (EF Core)进行数据访问时,常需执行复杂的数据库操作,如自定义函数调用或使用聚合函数汇总数据。EF Core 支持在 LINQ 查询中使用自定义与聚合函数,满足高级查询需求。
34 0
|
3月前
|
开发框架 前端开发 JavaScript
基于SqlSugar的开发框架循序渐进介绍(31)-- 在查询接口中实现多表联合和单表对象的统一处理
基于SqlSugar的开发框架循序渐进介绍(31)-- 在查询接口中实现多表联合和单表对象的统一处理
|
存储 XML SQL
Activiti工作流框架学习笔记(一)之通用数据表详细介绍
Activiti工作流框架学习笔记(一)之通用数据表详细介绍
474 1
|
Dubbo NoSQL Java
架构:第八章:查询的资料
架构:第八章:查询的资料
|
数据库
【自然框架】之通用权限:数据库设计的几种使用方式
      上次《【自然框架】之通用权限:用PowerDesigner重新设计了一下数据库,有ER图和表关系图 》里说了一大堆的表,好多人说太复杂了,做到权限到模块就可以了。       这个嘛,我也没有说所有的表都要一起使用呀。
1208 0
|
搜索推荐 数据库
【自然框架】之通用权限(五):项目描述表组
      继续,这是第五章了。我发现了,写文章比写程序还要有难度。   通用权限想要写的文章目录:(这是第五章)    1、 简介、数据库的总体结构2、 介绍人员表组3、 介绍组织结构表组4、 介绍角色表组5、 介绍“项目自我描述表组”6、 权限到节点7、 权限到按钮8、 权限到列...
1119 0
|
算法 数据库
【自然框架】元数据的数据库结构的详细说明和示例(一):项目描述部分
自然框架在线演示:  http://pthuanyu.com/   【自然框架】PowerDesigner 格式的元数据的表结构   自然框架的源码、Demo、数据库、说明文档的下载,还是老地方:自然框架的源代码、Demo、数据库、配置信息管理程序下载(2010.
961 0