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安装体验一下。