




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農產品批發市場合作運營協議
- 智能工廠智能生產線控制系統開發協議
- 委托加工制造合同及質量保證條款
- 浙江國企招聘2025臺州市城市建設投資發展集團有限公司招聘12人筆試參考題庫附帶答案詳解
- 2025重慶聯合產權交易所集團股份有限公司招聘31人筆試參考題庫附帶答案詳解
- 質量安全員試題及答案
- 2025冶金工業信息標準研究院招聘筆試參考題庫附帶答案詳解
- 電商產業園發展前景分析報告
- 紡織品設計師證書考試理念總結試題及答案
- 淘寶平臺客戶關系管理(CRM)戰略與實踐
- 河南五市2025年高三俄語二模試卷(無答案)
- 2025-2030中國旅游景區行業市場發展現狀及前景趨勢與投資發展研究報告
- 9.2 歐洲西部課件3-2024-2025學年七年級地理下學期人教版2024
- 2024年山東泰安岱岳區職業教育中心招聘筆試真題
- 2025-2030工程塑料行業市場深度分析及發展策略研究報告
- 2025-2030中國涂料設備行業市場發展趨勢與前景展望戰略研究報告
- 業務員合同范本與業務員和公司的合同6篇
- 2025年大學生學習鄉村振興知識競賽題庫及答案(共60道題)
- 2025年廣東廣州市高三二模高考英語試卷試題(含答案詳解)
- 期中考試質量分析會上校長引用6個關鍵詞講話:深耕、融合、賦能、深耕、創新、協同、堅守
- 2025屆高三化學備考:山東高考模擬練習-工業流程61道
評論
0/150
提交評論