Rafy 框架 - 通用查询条件(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

为了方便开发者使用 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 用户手册》中。

时间: 2024-12-21 01:41:53

Rafy 框架 - 通用查询条件(CommonQueryCriteria)的相关文章

Rafy 框架 - 使用 SqlTree 查询

本文介绍如何使用 Rafy 框架中的 Sql Tree 查询:   除了开发者常用的 Linq 查询,Rafy 框架还提供了 Sql 语法树的方式来进行查询. 这种查询方式下,开发者不需要直接编写真正的 Sql 语句,而是转而使用一套中间 Sql 语法树对象.这隔离了与具体数据库的耦合,使得开发者编写的查询可以跨越多种不同的数据库运行,甚至可以在非关系型数据库中运行.同时,框架还结合托管属性,提供了方便开发者使用的 API,并尽量保持与传统 Sql 相近的语法,使得开发者可以快速理解并编写. 本

Rafy 框架 - 幽灵插件(假删除)

Rafy 框架又添新成员:幽灵插件.本文将解释该插件的场景.使用方法.原理.   场景 在开发各类数据库应用系统时,往往需要在删除数据时不是真正地删除数据,而只是把数据标识为'已删除'状态.这些数据在业务逻辑上是已经完全删除.不可用的数据,但是不能在数据库中真正的把它们删除,而是需要永久保留这些历史数据.即开发人员常说的'假删除'功能. 这种需求往往是系统级的.往往不是针对某一张表,而很可能是针对系统中的所有表都需要实现'假删除'功能.   使用方法 由于这种需求比较常见,所以我们决定专门为该功

使用 NuGet 下载最新的 Rafy 框架及文档

为了让开发者更方便地使用 Rafy 领域实体框架,本月,我们已经把最新版本的 Rafy 框架程序集发布到了 nuget.org 上,同时,还把 RafySDK 的最新版本发布到了 VisualStudio 插件仓库中. 以下说明如何下载.更新最新的 SDK 及程序集.   下载.更新最新的 RafySDK 在 VisualStudio 中打开扩展管理器(Tools -> Extensions and Updates),选择在线项目,并搜索 "Rafy" 安装即可.如下图: 同样,

Rafy 框架 - 流水号插件

Rafy 框架又添新成员:流水号插件.本文将解释 Rafy 框架中的流水插件的场景.使用方法.   场景 在开发各类数据库应用系统时,往往需要生成从一开始的流水号,有时还需要按月或者按日进行独立生成,如下面的格式:2016031800000001.2016031800000002--. 设计本插件用于生成上述相应格式的编号.   使用方法 添加插件 1.通过 Nuget Package Manager 搜索并安装 Rafy.SerialNumber 插件. 2.在 DomainApp 中添加该插

struts2.0-只用Struts2框架多条件查询分页显示dao接口该咋写

问题描述 只用Struts2框架多条件查询分页显示dao接口该咋写 只用struts2框架不用hibernate和spring,可以多条件查询并且分页显示,要求一进去界面就显示查询结果那样子,dao接口该怎么写呢,实现类怎么写.sql语句往哪放啊.大神,求解啊. 解决方案 那你用什么与数据库交互?jdbc? 解决方案二: 实体类里创建个list',然后遍历list,应该是用jdbc 解决方案三: 实体类里创建个list',然后遍历list,应该是用jdbc

Rafy 框架-发布网页版用户手册

前段时间把 Rafy 的用户手册由 CHM 格式转换为了网页格式,而且发布到了 github.io 上,即方便文档的实时更新,也方便大家查看. Rafy 用户手册网页版地址: http://zgynhqf.github.io/Rafy.       --------------------------------------------------------------------------- 附: 如何使用 github.io 来发布网页版帮助文档: https://help.github

Rafy 框架 - 执行SQL或存储过程

有时候,开发者不想通过实体来操作数据库,而是希望通过 SQL 语句或存储过程来直接访问数据库.Rafy 也提供了一组 API 来方便实现这类需求.   IDbAccesser 接口 为了尽量屏蔽各数据库中 SQL 语句参数的不同标识,同时也为了使开发者更简单地实现参数化的查询.Rafy 中提供了 IDbAccesser 接口来方便开发者使用.接口定义如下: /// <summary> /// A db accesser which can use formatted sql to commun

Rafy 框架 - 为数据库生成注释

当开发者使用 CodeFirst 开发模式,编写了大量的实体类,在代码中编写了完整的类型注释和属性注释,并自动生成数据库后,往往需要把实体类型和实体属性上的注释同时生成到对应的数据库表及字段上.这样,即方便在查看数据库时能清晰地看到每一个表及字段的含义,也方便使用一些第三方的工具(如 PowerDesigner 等)为数据库生成较为全面的文档.   使用方法 在为数据库生成注释之前,需要保证数据库已经全部生成成功(即和实体保持一致).否则更新字段的注释时,可能因为字段不存在而导致执行失败. 需要

Rafy 框架 - 插件级别的扩展点

本章说明如何使用额外的插件(如客户化插件)对另一插件(如产品插件)进行扩展.   使用场景 在 产品线工程 中,项目的研发分为领域工程和应用工程.这个过程中会需要对领域工程中的内容进行大量的扩展.   分层与扩展点 下图中显示了一个产品插件的逻辑分层,以及各层对应的扩展点.   可扩展的内容 实体属性扩展 可以为产品插件的实体添加新的实体属性,也可以修改现有属性的一些元数据. 实体配置扩展 可以随意修改产品插件中的实体配置,如实体的数据库映射. 实体查询的扩展 可以添加新的实体查询.可以修改.替