




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C#表達(dá)式樹Expression動(dòng)態(tài)創(chuàng)建表達(dá)式///typeparamname="T"泛型/typeparam
publicstaticclassExpressionExtensionTwhereT:class,new()
///summary
///表達(dá)式動(dòng)態(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;
//邏輯運(yùn)算符判斷
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"查詢實(shí)體/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(cuò)誤或值類型不正確");
///summary
///創(chuàng)建Expression
////summary
privatestaticExpressionCreateExpression(Expressionleft,Expressionvalue,stringentityOperator)
if(!Enum.TryParse(entityOperator,true,outOperatorEnumoperatorEnum))
thrownewArgumentException("操作方法不存在,請(qǐng)檢查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)),
}
使用示例
例如有以下兩個(gè)實(shí)體類,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",代表兩個(gè)條件是并且的關(guān)系,如果需要查詢名稱包含"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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 浙江國企招聘2025臺(tái)州市城市建設(shè)投資發(fā)展集團(tuán)有限公司招聘12人筆試參考題庫附帶答案詳解
- 2025重慶聯(lián)合產(chǎn)權(quán)交易所集團(tuán)股份有限公司招聘31人筆試參考題庫附帶答案詳解
- 2025冶金工業(yè)信息標(biāo)準(zhǔn)研究院招聘筆試參考題庫附帶答案詳解
- 電商產(chǎn)業(yè)園發(fā)展前景分析報(bào)告
- 制作玻璃合同協(xié)議書范本
- 退股協(xié)議書是否合同終止
- 2024年新型聚合物驅(qū)油劑項(xiàng)目資金需求報(bào)告代可行性研究報(bào)告
- 垃圾清運(yùn)合同協(xié)議書模板
- 施工水電費(fèi)合同協(xié)議書
- 2025年綠色建筑認(rèn)證體系在綠色文化設(shè)施中的應(yīng)用與發(fā)展分析報(bào)告
- 9.2 歐洲西部課件3-2024-2025學(xué)年七年級(jí)地理下學(xué)期人教版2024
- 2025-2030工程塑料行業(yè)市場(chǎng)深度分析及發(fā)展策略研究報(bào)告
- 2025-2030中國涂料設(shè)備行業(yè)市場(chǎng)發(fā)展趨勢(shì)與前景展望戰(zhàn)略研究報(bào)告
- 業(yè)務(wù)員合同范本與業(yè)務(wù)員和公司的合同6篇
- 2025年大學(xué)生學(xué)習(xí)鄉(xiāng)村振興知識(shí)競(jìng)賽題庫及答案(共60道題)
- 2025年廣東廣州市高三二模高考英語試卷試題(含答案詳解)
- 期中考試質(zhì)量分析會(huì)上校長(zhǎng)引用6個(gè)關(guān)鍵詞講話:深耕、融合、賦能、深耕、創(chuàng)新、協(xié)同、堅(jiān)守
- 掛靠法人免責(zé)協(xié)議書
- 電網(wǎng)工程設(shè)備材料信息參考價(jià)(2024年第四季度)
- 碳中和技術(shù)概論全套教學(xué)課件
- LemonTree中英文歌詞
評(píng)論
0/150
提交評(píng)論