可动态构造查询条件的表达式类库(1)

Suucha Expression 是一个表达式类,可适用于需要动态构造查询条件的前端(JavaScript)和后端(C#)的代码中。并且提供基于IQueryable的Where扩展。

获取源代码及安装

源代码:http://suuchaexp.codeplex.com

在Visual Studio中通过Nuget控制台安装:

Install-Package SuuchaExp //安装类库

 

Install-Package SuuchaExpJs //安装js 

 

基本用法

//Javascript

var searchParameter = new Suucha.SearchParameters();

searchParameter.Page = 1;

searchParameter.PageSize = 20;

searchParameter.Condition = Suucha.Expression.Equal('Name', 'name');

searchParameter.Condition = Suucha.Expression.And(searchParameter.Condition, 

                            Suucha.Expression.Equal('Code', '01'));

//Json序列化后可以发送到服务端

var json = Ext.JSON.encode(searchParameter);

服务端可以直接使用SearchParameters的静态方法FromJson进行反序列化:

var search = SearchParameters.FromJson(json);

var result = query.Where(search.Condition);

 

SuuchaExpression类及方法

suucha Expression提供三种类型的表达式:

  • SuuchaMemberExpression,成员表达式
  • SuuchaConstantExpression,常量表达式
  • SuuchaBinaryExpression,二元表达式

他们都是继承自SuuchaExpression,SuuchaExpression还提供静态方法来创建这些表达式(Javascript中也有对应的方法)和构造简单的表达式树:

SuuchaMemberExpression Member(string name) 根据成员名称创建一个成员表达式,name格式:"Code", "User.Name"
SuuchaConstantExpression Constant(object value) 创建一个常量表达式
SuuchaBinaryExpression Equal(string left, object right) 创建一个等于的二元表达式,有多个重载
SuuchaBinaryExpression NotEqual(string left, object right) 创建一个不等于的二元表达式,有多个重载
SuuchaBinaryExpression LessThan(string left, object right) 创建一个小于的二元表达式,有多个重载
SuuchaBinaryExpression LessThanOrEqual(string left, object right) 创建一个小于等于的二元表达式,有多个重载
SuuchaBinaryExpression GreaterThan(string left, object right) 创建一个大于的二元表达式,有多个重载
SuuchaBinaryExpression GreaterThanOrEqual(string left, object right) 创建一个大于等于的二元表达式,有多个重载
SuuchaBinaryExpression Like(string left, string right) 创建一个Like操作的二元表达式,left是成员名称,right是要查找的字符串,可以使用通配符:%
SuuchaBinaryExpression NotLike(string left, string right) 创建一个NotLike操作的二元表达式
SuuchaBinaryExpression In(string left, string right) 创建一个In操作的二元表达式,right必须是用逗号分隔的多个值
SuuchaBinaryExpression InLike(string left, string right) 创建一个InLike操作的二元表达式,right必须是用逗号分隔的多个值
SuuchaBinaryExpression And(SuuchaBinaryExpression left, SuuchaBinaryExpression right) 构造一个And操作的二元表达式
SuuchaBinaryExpression Or(SuuchaBinaryExpression left, SuuchaBinaryExpression right) 构造一个Or操作的二元表达式
SuuchaExpression FromJson(string json) 从Json字符串反序列化

基于IQueryable的扩展:

  • IQueryable Where(this IQueryable source, SuuchaExpression expression)
  • IQueryable<T> OrderBy<T>(this IQueryable<T> source, IEnumerable<SuuchaOrderBy> orderBy)

这里需要特别说明的是成员表达式中成员名称可以是Primitive属性(比如Code),也可以是关联属性的Primitive属性(比如User.Name),还支持集合关联属性,通过一个例子来说明下:

有一个角色类Role,一个用户类User,Role中有一个User的集合属性Users,现在需要查找角色的Users中User名称中包含"张"的角色,可以用如下的代码实现:

var condition = SuuchaExpression.Like("Users.Name","");

var result = roles.Where(condition);

 

SuuchaExpression特别适合需要通过Javascript动态构建查询条件的场景,如果您感兴趣,可以下载源代码或通过nuget安装体验一下。

你可能感兴趣的:(表达式)