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安裝體驗一下。