




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第C#表達式樹Expression動態(tài)創(chuàng)建表達式///typeparamname="T"泛型/typeparam
publicstaticclassExpressionExtensionTwhereT:class,new()
///summary
///表達式動態(tài)拼接
////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
///創(chuàng)建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
///屬性類型轉(zhuǎn)換
////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("字段類型轉(zhuǎn)換失?。鹤侄蚊e誤或值類型不正確");
///summary
///創(chuàng)建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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新生入學適應性教育培訓
- 護理不良事件的相關知識
- 院感生物學監(jiān)測采樣培訓
- 核酸檢測師資培訓課件
- 胸腰椎骨折護理
- 拓展培訓流程標準化實施
- 春節(jié)安全教育培訓綱要
- 停電專項方案
- 鍋爐風煙系統(tǒng)培訓
- 假期測驗考試題及答案
- 2025年中小學暑假安全教育主題家長會 課件
- 顱內(nèi)血腫護理查房
- 門診急救室管理制度
- 2025年沈陽水務集團有限公司-企業(yè)報告(代理機構版)
- 近視管理白皮書(2025)專家共識-
- 2024年深圳市深汕特別合作區(qū)農(nóng)村工作者招聘真題
- 數(shù)字化藝術-終結(jié)性考核-國開(SC)-參考資料
- 2024年貴州省糧食儲備集團有限公司招聘考試真題
- 2025山西晉城市國有資本投資運營有限公司部分子公司招聘11人筆試參考題庫附帶答案詳解
- 2025盤錦市興隆臺區(qū)輔警考試試卷真題
- 壓縮空氣儲能系統(tǒng)透平膨脹機流動特性與損失優(yōu)化研究
評論
0/150
提交評論