




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C#表達(dá)式樹(shù)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();
//包含'.',說(shuō)明是父表的字段
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
///屬性類(lèi)型轉(zhuǎn)換
////summary
///paramname="entity"查詢(xún)實(shí)體/param
///returns/returns
privatestaticobjectParseType(QueryEntityentity)
PropertyInfoproperty;
//包含'.',說(shuō)明是子類(lèi)的字段
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("字段類(lèi)型轉(zhuǎn)換失?。鹤侄蚊e(cuò)誤或值類(lèi)型不正確");
///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í)體類(lèi),Address是User的子類(lèi)
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;}
}
單條件查詢(xún)
查詢(xún)用戶(hù)表中名稱(chēng)(name)包含"chen":
ListQueryEntitylist=newListQueryEntity
newQueryEntity
Key="name",
Value="chen",
Operator="Contains"
varexpression=ExpressionExtensionUser.ExpressionSplice(list);
//expression=Param_0=Param_0.Name.Contains("chen")
查詢(xún)用戶(hù)表中年齡(age)大于等于18:
ListQueryEntitylist=newListQueryEntity
newQueryEntity
Key="age",
Value="18",
Operator="GreaterEqual"
varexpression=ExpressionExtensionUser.ExpressionSplice(list);
//expression=Param_0=Param_0.Name.GreaterThanOrEqual(18)
多條件查詢(xún)
查詢(xún)用戶(hù)表中名稱(chēng)(name)包含"chen"并且年齡(age)大于等于18:
ListQueryEntitylist=newListQueryEntity
newQueryEntity
Key="name",
Value="chen",
Operator="Contains"
newQueryEntity
Key="age",
Value="18",
Operator="GreaterEqual",
//注意:這里得填入"AND",代表兩個(gè)條件是并且的關(guān)系,如果需要查詢(xún)名稱(chēng)包含"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))
多表查詢(xún)
查詢(xún)用戶(hù)表中名稱(chēng)(name)包含"chen"并且地址(address)在廣東省
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國(guó)特色幼兒教育行業(yè)市場(chǎng)現(xiàn)狀及未來(lái)發(fā)展趨勢(shì)研究報(bào)告
- 2022年江蘇省無(wú)錫市中考物理模擬試卷
- 安全測(cè)試面試題目及答案
- 教育與科技的結(jié)合醫(yī)療行業(yè)的數(shù)字化轉(zhuǎn)型
- 2025年錢(qián)幣卡項(xiàng)目市場(chǎng)調(diào)查研究報(bào)告
- 2025年金箔工藝扇項(xiàng)目市場(chǎng)調(diào)查研究報(bào)告
- 2025年金剛石薄壁鉆項(xiàng)目市場(chǎng)調(diào)查研究報(bào)告
- 2025年酸漬四葉瓜項(xiàng)目市場(chǎng)調(diào)查研究報(bào)告
- 教育改革背景下的辦公室管理與領(lǐng)導(dǎo)者素質(zhì)提升
- 2025年逆變推動(dòng)模塊項(xiàng)目市場(chǎng)調(diào)查研究報(bào)告
- 2025年高考數(shù)學(xué)二輪熱點(diǎn)題型歸納與演練(上海專(zhuān)用)專(zhuān)題02函數(shù)(九大題型)(原卷版+解析)
- 2024年浙江省中考社會(huì)試卷真題(含標(biāo)準(zhǔn)答案及評(píng)分標(biāo)準(zhǔn))
- 第五版-FMEA培訓(xùn)教材-新版
- NB-T32036-2017光伏發(fā)電工程達(dá)標(biāo)投產(chǎn)驗(yàn)收規(guī)程
- 食品安全與日常飲食智慧樹(shù)知到期末考試答案章節(jié)答案2024年中國(guó)農(nóng)業(yè)大學(xué)
- PE袋化學(xué)品安全技術(shù)說(shuō)明書(shū)MSDS(聚乙烯塑膠袋)
- 100以?xún)?nèi)進(jìn)退位加減法口算題每天60道
- 醫(yī)院檢驗(yàn)科實(shí)驗(yàn)室生物安全管理手冊(cè)
- 七人學(xué)生小品《如此課堂》劇本臺(tái)詞手稿
- 部編版七年級(jí)語(yǔ)文下冊(cè)文言文專(zhuān)項(xiàng)練習(xí)
- 醫(yī)院禁止胎兒性別鑒定的承諾書(shū)和責(zé)任書(shū)
評(píng)論
0/150
提交評(píng)論