可動態構造查詢條件的表達式類庫(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安裝體驗一下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM