您好,登錄后才能下訂單哦!
這篇文章主要介紹“如惡化自定義函數Expression轉化為sql”,在日常操作中,相信很多人在如惡化自定義函數Expression轉化為sql問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如惡化自定義函數Expression轉化為sql”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
一.首先建立一個建一個擴展類,控制只能允許這些函數出現,如果出現其他函數就直接報異常。
1 public static class SQLMethods 2 { 3 public static bool DB_In<T>(this T t, List<T> list) // in 4 { 5 return true; 6 } 7 public static Boolean DB_NotIn<T>(this T t, List<T> list) // not in 8 { 9 return true; 10 } 11 public static int DB_Length(this string t) // len(); 12 { 13 return 0; 14 } 15 public static bool DB_Like(this string t, string str) // like 16 { 17 return true; 18 } 19 public static bool DB_NotLike(this string t, string str) // not like 20 { 21 return true; 22 } 23 }
View Code
我們要生成sql,那么函數的返回值沒有意思,len() ,like,和not 只能針對字符串類型, in 和not in 可以針對所有類型。
二.處理不同函數相關的邏輯。
1.判斷函數所在類的命名空間是否我是我們要求的。
2.根據函數名處理。出現意外函數拋出異常
代碼如下"
1 private string DealMethodsCall(MethodCallExpression m_exp) 2 { 3 var k = m_exp; 4 var g = k.Arguments[0]; 5 /// 控制函數所在類名。 6 if (k.Method.DeclaringType != typeof(SQLMethods)) 7 { 8 throw new Exception("無法識別函數"); 9 } 10 switch (k.Method.Name) 11 { 12 case "DB_Length": 13 { 14 var exp = k.Arguments[0]; 15 return "LEN(" + DealExpression(exp) + ")"; 16 } 17 case "DB_In": 18 case "DB_NotIn": 19 { 20 var exp1 = k.Arguments[0]; 21 var exp2 = k.Arguments[1]; 22 string methods = string.Empty; 23 if (k.Method.Name == "In") 24 { 25 methods = " IN "; 26 } 27 else 28 { 29 methods = " NOT IN "; 30 } 31 return DealExpression(exp1) + methods + DealExpression(exp2); 32 } 33 case "DB_Like": 34 case "DB_NotLike": 35 { 36 var exp1 = k.Arguments[0]; 37 var exp2 = k.Arguments[1]; 38 string methods = string.Empty; 39 if (k.Method.Name == "DB_Like") 40 { 41 methods = " LIKE "; 42 } 43 else 44 { 45 methods = " NOT LIKE "; 46 } 47 return DealExpression(exp1) + methods + DealExpression(exp2); 48 49 } 50 } 51 /// 未知的函數 52 throw new Exception("意外的函數"); 53 }
處理相關函數
三. 調試結果
到此,關于“如惡化自定義函數Expression轉化為sql”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。