




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第C#表達式樹Expression動態創建表達式///typeparamname="T"泛型/typeparam
publicstaticclassExpressionExtensionTwhereT:class,new()
///summary
///表達式動態拼接
////summary
publicstaticExpressionFuncT,boolExpressionSplice(ListQueryEntityentities)
if(entities.Count1)
returnex=true;
varexpression_first=CreateExpressionDelegate(entities[0]);
foreach(varentityinentities.Skip(1))
varexpression=CreateExpressionDelegate(entity);
InvocationExpressioninvocation=Expression.Invoke(expression_first,expression.Parameters.CastExpression
BinaryExpressionbinary;
//邏輯運算符判斷
if(entity.LogicalOperator.ToUpper().Equals("OR"))
binary=Expression.Or(expression.Body,invocation);
else
binary=Expression.And(expression.Body,invocation);
expression_first=Expression.LambdaFuncT,bool(binary,expression.Parameters);
returnexpression_first;
///summary
///創建ExpressionTDelegate
////summary
privatestaticExpressionFuncT,boolCreateExpressionDelegate(QueryEntityentity)
ParameterExpressionparam=Expression.Parameter(typeof(T));
Expressionkey=param;
varentityKey=entity.Key.Trim();
//包含'.',說明是父表的字段
if(entityKey.Contains('.'))
vartableNameAndField=entityKey.Split('.');
key=Expression.Property(key,tableNameAndField[0].ToString());
key=Expression.Property(key,tableNameAndField[1].ToString());
else
key=Expression.Property(key,entityKey);
Expressionvalue=Expression.Constant(ParseType(entity));
Expressionbody=CreateExpression(key,value,entity.Operator);
varlambda=Expression.LambdaFuncT,bool(body,param);
returnlambda;
///summary
///屬性類型轉換
////summary
///paramname="entity"查詢實體/param
///returns/returns
privatestaticobjectParseType(QueryEntityentity)
PropertyInfoproperty;
//包含'.',說明是子類的字段
if(entity.Key.Contains('.'))
vartableNameAndField=entity.Key.Split('.');
property=typeof(T).GetProperty(tableNameAndField[0],BindingFlags.IgnoreCase|BindingFlags.Public|BindingFlags.Instance);
property=property.PropertyType.GetProperty(tableNameAndField[1],BindingFlags.IgnoreCase|BindingFlags.Public|BindingFlags.Instance);
else
property=typeof(T).GetProperty(entity.Key,BindingFlags.IgnoreCase|BindingFlags.Public|BindingFlags.Instance);
returnConvert.ChangeType(entity.Value,property.PropertyType);
catch(Exception)
thrownewArgumentException("字段類型轉換失敗:字段名錯誤或值類型不正確");
///summary
///創建Expression
////summary
privatestaticExpressionCreateExpression(Expressionleft,Expressionvalue,stringentityOperator)
if(!Enum.TryParse(entityOperator,true,outOperatorEnumoperatorEnum))
thrownewArgumentException("操作方法不存在,請檢查operator的值");
returnoperatorEnumswitch
OperatorEnum.Equals=Expression.Equal(left,Expression.Convert(value,left.Type)),
OperatorEnum.NotEqual=Expression.NotEqual(left,Expression.Convert(value,left.Type)),
OperatorEnum.Contains=Expression.Call(left,typeof(string).GetMethod("Contains",newType[]{typeof(string)}),value),
OperatorEnum.StartsWith=Expression.Call(left,typeof(string).GetMethod("StartsWith",newType[]{typeof(string)}),value),
OperatorEnum.EndsWith=Expression.Call(left,typeof(string).GetMethod("EndsWith",newType[]{typeof(string)}),value),
OperatorEnum.Greater=Expression.GreaterThan(left,Expression.Convert(value,left.Type)),
OperatorEnum.GreaterEqual=Expression.GreaterThanOrEqual(left,Expression.Convert(value,left.Type)),
OperatorEnum.Less=Expression.LessThan(left,Expression.Convert(value,left.Type)),
OperatorEnum.LessEqual=Expression.LessThanOrEqual(left,Expression.Convert(value,left.Type)),
_=Expression.Equal(left,Expression.Convert(value,left.Type)),
}
使用示例
例如有以下兩個實體類,Address是User的子類
publicclassUser
publicintId{get;set;}
publicstringName{get;set;}=string.Empty;
publicintAge{get;set;}
publicDateTimeCreateTime{get;set;}
publicAddressAddress{get;set;}
publicclassAddress
publicstringProvince{get;set;}
publicstringCity{get;set;}
}
單條件查詢
查詢用戶表中名稱(name)包含"chen":
ListQueryEntitylist=newListQueryEntity
newQueryEntity
Key="name",
Value="chen",
Operator="Contains"
varexpression=ExpressionExtensionUser.ExpressionSplice(list);
//expression=Param_0=Param_0.Name.Contains("chen")
查詢用戶表中年齡(age)大于等于18:
ListQueryEntitylist=newListQueryEntity
newQueryEntity
Key="age",
Value="18",
Operator="GreaterEqual"
varexpression=ExpressionExtensionUser.ExpressionSplice(list);
//expression=Param_0=Param_0.Name.GreaterThanOrEqual(18)
多條件查詢
查詢用戶表中名稱(name)包含"chen"并且年齡(age)大于等于18:
ListQueryEntitylist=newListQueryEntity
newQueryEntity
Key="name",
Value="chen",
Operator="Contains"
newQueryEntity
Key="age",
Value="18",
Operator="GreaterEqual",
//注意:這里得填入"AND",代表兩個條件是并且的關系,如果需要查詢名稱包含"chen"或者年齡大于等于18,則填入"OR"
"logicalOperator":"AND"
varexpression=ExpressionExtensionUser.ExpressionSplice(list);
//expression=Param_0=((Param_0.Status=Convert(1,Int32))AndInvoke(Param_1=Param_1.OpenId.Contains("9JJdFTVt6oimCgdbW61sk"),Param_0))
多表查詢
查詢用戶表中名稱(name)包含"chen"并且地址(address)在廣東省
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- ××超市某超市員工招聘制度
- 網絡安全保障協議和責任界定
- 汽車行業購車資格及經濟實力出資證明書(6篇)
- 2025年自動造型線項目申請報告
- 法律邏輯學案例分析與解析手冊
- 2025年橋架項目提案報告
- 冬日雪景抒寫作文9篇
- 2025年保密局公務員錄用考試申論試卷
- 建筑設計優化服務協議
- 2025年大學輔導員招聘考試:學生社團管理案例分析歷年真題解析匯編
- 醫院培訓課件:《外科手術部位感染預防與控制》
- 臨床輸血技術規范培訓課件
- 2024年高考真題-物理(貴州卷) 含解析
- 雨污水工程安全培訓
- 華南理工大學《機器學習》2022-2023學年期末試卷
- 2024年人教版八年級語文下冊期末考試卷(附答案)
- 影視劇組場地租賃合同
- 個體工商戶食品安全管理制度
- TSXCAS 015-2023 全固廢低碳膠凝材料應用技術標準
- 北京交通大學《交通系統建模與測試技術》2022-2023學年第一學期期末試卷
- 耳穴考核試題及答案
評論
0/150
提交評論