国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

輕量級表達式樹解析框架Faller

2019-11-14 16:33:21
字體:
來源:轉載
供稿:網友

有話說

之前我寫了3篇關于表達式樹解析的文章

干貨!表達式樹解析"框架"(1)

干貨!表達式樹解析"框架"(2)

干貨!表達式樹解析"框架"(3) 

這3篇文章更多的是說明一種方法,一種思路,而代碼比較少

在發出來之后也有些朋友互加了好友一起討論

在經過一些時間的修改和優化后,就有了現在這個框架

目前這個框架實現了SqlServer和Oracle的解釋

其他數據庫1來是不熟2來沒時間3來我更希望大家可以使用這個框架自己動手實現一個數據庫的解析,非常有意思

特色

  1. 首先是這個框架的名字 : Faller 中譯 伐木工,但我喜歡叫他 "砍樹人",因為他把"表達式樹"這顆大樹砍成一片一片的小塊然后轉化成sql語句
  2. 輕量 : 不僅僅是代碼輕量,重新實現對一個新的數據庫支持也很輕量,只需要實現ISaw接口,或繼承BaseSaw實現少量方法即可
    如 : 
    Where(u => u.Birthday.Day == 1);                   //EXTRACT(DAY FROM a.BIRTHDAY) = 1Where(u => u.Name.Trim() == "");                    //ltrim(rtrim(a.NAME)) = :auto_p0Where(u => string.IsNullOrEmpty(u.Name));      //a.NAME IS NULL OR a.NAME == ''

     

  3. 靈活 : 在輕量的基礎上盡量做到了靈活,可以非常方便的解析各種C#的方法

  4. 對 DateTime.Now 的處理 : 
    如 :  Where(u => u.Birthday < DateTime.Now) //可以被解析為 BIRTHDAY < SYSDATE 或 BIRTHDAY < GETDATE() 
  5. 自由的 SqlExPR : 有時候 我們不得不使用Sql來表示某個數據庫特有的數據
    如 :  Set<User>(() => new User{ ID = (SqlExpr)"seq_user.nextval"}) //解析后得到 ID = seq_user.nextval 
  6. 使用方便 : 可以非常方便的嵌入到現已有的項目中,主要根據自己項目的需求重新實現ISaw即可

 

使用方式

void Where(string expected, Expression<Func<User, bool>> expr){    var parse = Faller.Create(expr);     //通過LambdaExpression創建Faller對象    var sql = parse.ToWhere(OracleSaw.Instance);//使用特定的ISaw來格式化Sql語句    //parse.Parameters  //解析過程中產生的參數    Assert.AreEqual(expected, sql);}

項目結構

  • Faller : 解析框架主要功能類,不可重寫,實現 IFaller 接口,主要方法有 public static IFaller Create(LambdaExpression expr)
  • ISaw : 定義一組方法,它支持自定義Sql語句的格式。Faller負責拆解 LambdaExpression ,然后把特定的對象交給ISaw處理返回sql語句 
  • SawDust : 解析結果。當一個方法在Faller中無法被解釋時候,Faller會把方法所用到的對象和參數都構造成為SawDust 并交給ISaw處理,SawDust 由DustType Type和Object Value組成
  • DustType : 表示解釋結果類型的枚舉 ,它的值有 Undefined, Sql, Object, Number, Array, Boolean, DateTime, Binary, String
  • SqlExpr : Sql表達式,它只能由String強轉獲得; 它可以隱式轉換為所有基礎對象,但只能在表達式樹中使用, 如
    Where<User>(u => (SqlExpr)"@@identity" == 5); //@@identity = 5

 

對象定義

// 輕量級表達式樹解析器 接口 public interface IFaller{    // 將表達式轉為Where語句,不包含Where關鍵字    //saw: 自定義輸出Sql語句的格式的對象    string ToWhere(ISaw saw);    // 將表達式轉為OrderBy語句,不包含OrderBy關鍵字    //saw: 自定義輸出Sql語句的格式的對象    //asc: 正序或倒序標識    string ToOrderBy(ISaw saw, bool asc);    // 將表達式轉為Update中Set語句,不包含Set關鍵字    //saw: 自定義輸出Sql語句的格式的對象    string ToSets(ISaw saw);    // 將表達式轉為select語句中的列或列集合的Sql語句    //saw: 自定義輸出Sql語句的格式的對象    string ToSelectColumns(ISaw saw);    // 將表達式轉為值或值集合的sql語句    //saw: 自定義輸出Sql語句的格式的對象    string ToValues(ISaw saw);    // 將表達式轉為值或值集合的sql語句    //saw: 自定義輸出Sql語句的格式的對象    string ToValues(ISaw saw, Func<string, string> replace);    // 將表達式轉為列集合和值集合2個sql語句,可用于拼裝insert語句    //saw: 自定義輸出Sql語句的格式的對象    KeyValuePair<string, string> ToColumnsAndValues(ISaw saw);    // 轉換Sql語句過程中產生的參數    ICollection<DbParameter> Parameters { get; }}
IFaller
    /// <summary> 定義一組方法,它支持自定義Sql語句的格式。    /// </summary>    public interface ISaw    {        /// <summary> 解釋二元操作        /// </summary>        /// <param name="left">左元素</param>        /// <param name="Operator">二元操作符</param>        /// <param name="right">右元素</param>        string BinaryOperation(string left, BinaryOperator @operator, string right);        /// <summary> 解釋Contains操作        /// </summary>        /// <param name="not">是否為not</param>        /// <param name="item">要在集合中查找的對象</param>        /// <param name="array">要查找的集合</param>        string ContainsOperation(bool not, string item, string[] array);        /// <summary> 向參數集合中追加一個任意類型的參數,并返回參數名sql表達式        /// </summary>        /// <param name="obj">需要追加的參數值</param>        /// <param name="parameters">參數集合</param>        string AddObject(object obj, ICollection<DbParameter> parameters);        /// <summary> 向參數集合中追加一個數字類型的參數,并返回參數名sql表達式        /// </summary>        /// <param name="number">需要追加的數字</param>        /// <param name="parameters">參數集合</param>        string AddNumber(IConvertible number, ICollection<DbParameter> parameters);        /// <summary> 向參數集合中追加一個布爾類型的參數,并返回參數名sql表達式        /// </summary>        /// <param name="obj">需要追加的布爾值</param>        /// <param name="parameters">參數集合</param>        string AddBoolean(bool value, ICollection<DbParameter> parameters);        /// <summary> 向參數集合中追加當前時間,并返回參數名sql表達式        /// </summary>        /// <param name="parameters">參數集合</param>        string AddTimeNow(ICollection<DbParameter> parameters);        /// <summary> 獲取實體類型所映射的表名        /// </summary>        /// <param name="type">實體類型</param>        /// <param name="alias">別名</param>        string GetTable(Type type, string alias);        /// <summary> 獲取實體屬性或字段所映射的列名        /// </summary>        /// <param name="table">表名或表別名</param>        /// <param name="type">實體屬性或字段</param>        string GetColumn(string table, MemberInfo member);        /// <summary> 獲取列名和列別名組合后的sql表達式        /// </summary>        /// <param name="columnName">列名</param>        /// <param name="alias">列別名</param>        string GetColumn(string columnName, string alias);        /// <summary> 將.NET中的方法解釋為sql表達式        /// </summary>        /// <param name="method">需解釋的方法</param>        /// <param name="target">方法調用者</param>        /// <param name="args">方法參數</param>        /// <returns></returns>        string ParseMethod(MethodInfo method, SawDust target, SawDust[] args);    }
ISaw
    /// <summary> 表達式樹解析結果    /// </summary>    public struct SawDust    {        /// <summary> 結果類型        /// </summary>        public readonly DustType Type;        /// <summary> 結果值        /// </summary>        public readonly Object Value;        /// <summary> 無論結果類型 強制轉換為Sql語句,DustType.Undefined拋出異常        /// </summary>        public string ToSql();                /// <summary>  是否是非DustType.Sql和DustType.Undefined類型        /// </summary>        public bool IsObject { get;}    }
SawDust(不包含實現)
    /// <summary> 表達式解析結果類型    /// </summary>    [System.Serializable]    public enum DustType    {        /// <summary> 未知        /// </summary>        Undefined = 0,        /// <summary> sql語句        /// </summary>        Sql = 1,        /// <summary> 未知類型        /// </summary>        Object = 2,        /// <summary> 數字        /// </summary>        Number = 3,        /// <summary> 數組        /// </summary>        Array = 4,        /// <summary> 布爾值        /// </summary>        Boolean = 5,        /// <summary> 時間        /// </summary>        DateTime = 6,        /// <summary> 二進制        /// </summary>        Binary = 7,        /// <summary> 字符串        /// </summary>        String = 8,    }
DustType
/// <summary> Sql表達式    /// </summary>    public struct SqlExpr    {        public static explicit operator SqlExpr(string value);        public static implicit operator bool(SqlExpr value);        public static implicit operator byte(SqlExpr value);        public static implicit operator char(SqlExpr value);        public static implicit operator DateTime(SqlExpr value);        public static implicit operator decimal(SqlExpr value);        public static implicit operator double(SqlExpr value);        public static implicit operator short(SqlExpr value);        public static implicit operator int(SqlExpr value);        public static implicit operator long(SqlExpr value);        public static implicit operator sbyte(SqlExpr value);        public static implicit operator float(SqlExpr value);        public static implicit operator string(SqlExpr value);        public static implicit operator ushort(SqlExpr value);        public static implicit operator uint(SqlExpr value);        public static implicit operator ulong(SqlExpr value);        public static implicit operator Guid(SqlExpr value);        public static implicit operator Byte[](SqlExpr value);    }
SqlExpr

 

    /// <summary> 支持自定義Sql語句格式基類。    /// </summary>    public abstract class BaseSaw : ISaw    {        /// <summary> 初始化并提供 DbProviderFactory        /// </summary>        /// <param name="factory"></param>        protected BaseSaw(DbProviderFactory factory);        /*         * 接口已定義方法略...         */        /// <summary> 解釋未知的方法        /// </summary>        /// <param name="method">需解釋的方法</param>        /// <param name="target">方法調用者</param>        /// <param name="args">方法參數</param>        protected virtual string ParseUnknownMethod(MethodInfo method, SawDust target, SawDust[] args);        /// <summary> 獲取新的數據庫參數        /// </summary>        /// <param name="obj">參數值</param>        protected virtual DbParameter GetDbParameter(object obj);        /// <summary> 別名分隔符 默認 AS ,如 Table AS it        /// </summary>        protected virtual string AliasSeparator { get; }        /// <summary> 解釋按位運算 與,或,非        /// </summary>        /// <param name="val1">操作數1</param>        /// <param name="val2">操作數2</param>        /// <param name="opt">按位操作符</param>        protected virtual string BitOperation(string val1, string val2, BitOperator opt);        /// <summary> 解釋取余運算        /// </summary>        /// <param name="val1">操作數1</param>        /// <param name="val2">操作數2</param>        /// <returns></returns>        protected virtual string ModuloOperation(string val1, string val2);        /// <summary> 解釋冪運算        /// </summary>        /// <param name="val1">操作數1</param>        /// <param name="val2">操作數2</param>        /// <returns></returns>        protected virtual string PowerOperation(string val1, string val2);        /// <summary> 解釋位移運算        /// </summary>        /// <param name="val1">操作數1</param>        /// <param name="val2">操作數2</param>        /// <param name="opt">按位操作符</param>        protected virtual string ShiftOperation(string val1, string val2, ShiftOperator opt);        /// <summary> 解釋 String.Trim 方法        /// </summary>        /// <param name="target">方法調用者</param>        /// <param name="arg">方法參數</param>        protected virtual string StringTrim(string target, string arg);        /// <summary> 解釋 String.TrimEnd 方法        /// </summary>        /// <param name="target">方法調用者</param>        /// <param name="arg">方法參數</param>        protected virtual string StringTrimEnd(string target, string arg);        /// <summary> 解釋 String.TrimStart 方法        /// </summary>        /// <param name="target">方法調用者</param>        /// <param name="arg">方法參數</param>        protected virtual string StringTrimStart(string target, string arg);        /// <summary> 解釋 String.IsNullOrEmpty 方法        /// </summary>        /// <param name="target">方法調用者</param>        protected virtual string StringIsNullOrEmpty(string target);        /// <summary> 解釋 String.IsNullOrWhiteSpace 方法        /// </summary>        /// <param name="target">方法調用者</param>        protected virtual string StringIsNullOrWhiteSpace(string target);        /// <summary> 解釋 String.Length 方法        /// </summary>        /// <param name="target">方法調用者</param>        protected virtual string StringLength(string target);        /// <summary> 解釋 Object.ToString 方法        /// </summary>        /// <param name="type">調用者類型</param>        /// <param name="target">方法調用者</param>        /// <param name="format">格式化參數</param>        protected virtual string ObjectToString(DustType type, string target, string format);        /// <summary> 解釋 DateTime 中的數據        /// </summary>        /// <param name="datetime">方法調用者</param>        protected virtual string DateTimeToField(string datetime, DateTimeField field);        /// <summary> 解釋各種 Number.Parse 方法        /// </summary>        /// <param name="target">string對象</param>        protected virtual string SrtingToNumber(string target);        #region abstract        /// <summary> 返回實體類型所映射的表名        /// </summary>        /// <param name="type">實體類型</param>        protected abstract string TableName(Type type);        /// <summary> 返回實體屬性或字段所映射的列名        /// </summary>        /// <param name="member">實體屬性或字段</param>        protected abstract string ColumnName(MemberInfo member);        /// <summary> 參數的前綴符號,如SqlServer中的@,Oracle中的:        /// </summary>        protected abstract string ParameterPreFix { get; }        /// <summary> 在數據庫中表示當前時間的表達式,如SqlServer中的getdate,Oracle中的SYSDATE        /// </summary>        protected abstract string TimeNow { get; }        /// <summary> 解釋Like操作        /// </summary>        /// <param name="val1">操作數1</param>        /// <param name="val2">操作數2</param>        /// <param name="opt">按位操作符</param>        protected abstract string LikeOperation(string val1, string val2, LikeOperator opt);        #endregion    }
BaseSaw(不包含實現)
    /// <summary> 二元操作符枚舉    /// </summary>    [Serializable]    public enum BinaryOperator    {        /// <summary>/// </summary>        Add,        /// <summary>/// </summary>        Subtract,        /// <summary>/// </summary>        Divide,        /// <summary> 取余        /// </summary>        Modulo,        /// <summary>/// </summary>        Multiply,        /// <summary> 冪運算        /// </summary>        Power,        /// <summary> 位移運算 a &lt;&lt; b        /// </summary>        LeftShift,        /// <summary> 位移運算 a &gt;&gt; b        /// </summary>        RightShift,        /// <summary> 與 a &amp;&amp; b 或 a AND b        /// </summary>        And,        /// <summary> 或 a || b 或 a OR b        /// </summary>        Or,        /// <summary> 等于 a == b        /// </summary>        Equal,        /// <summary> 不等于 a != b 或 a <> b        /// </summary>        NotEqual,        /// <summary> 大于 a &gt; b        /// </summary>        GreaterThan,        /// <summary> 大于等于 a &gt;= b        /// </summary>        GreaterThanOrEqual,        /// <summary> 小于 a &lt; b        /// </summary>        LessThan,        /// <summary> 小于等于 a &lt;= b        /// </summary>        LessThanOrEqual,        /// <summary> LIKE操作 a LIKE %b%        /// </summary>            Contains,                 /// <summary> LIKE操作 a LIKE b%        /// </summary>            StartWith,                /// <summary> LIKE操作 a LIKE %b        /// </summary>            EndWith,                  /// <summary> LIKE操作 a NOT LIKE %b%        /// </summary>            NotContains,              /// <summary> LIKE操作 a NOT LIKE b%        /// </summary>            NotStartWith,             /// <summary> LIKE操作 a NOT LIKE %b        /// </summary>        NotEndWith,        /// <summary> 位運算 如 a &amp; b        /// </summary>        BitAnd,        /// <summary> 位運算 如 a | b        /// </summary>        BitOr,        /// <summary> 位運算 如 a ^ b        /// </summary>        BitXor,    }    /// <summary> 按位操作符枚舉    /// </summary>    [Serializable]    public enum BitOperator    {        /// <summary> 位運算 如 a &amp; b        /// </summary>        And,        /// <summary> 位運算 如 a | b        /// </summary>        Or,        /// <summary> 位運算 如 a ^ b        /// </summary>        Xor,    }    /// <summary> Like操作符枚舉    /// </summary>    [Serializable]    public enum LikeOperator    {        /// <summary> LIKE操作 a LIKE %b%        /// </summary>            Contains,        /// <summary> LIKE操作 a LIKE b%        /// </summary>            StartWith,        /// <summary> LIKE操作 a LIKE %b        /// </summary>            EndWith,        /// <summary> LIKE操作 a NOT LIKE %b%        /// </summary>            NotContains,        /// <summary> LIKE操作 a NOT LIKE b%        /// </summary>            NotStartWith,        /// <summary> LIKE操作 a NOT LIKE %b        /// </summary>        NotEndWith,    }    /// <summary> 位移操作符枚舉    /// </summary>    [Serializable]    public enum ShiftOperator    {                 /// <summary> 位移運算 a &lt;&lt; b        /// </summary>        Left,        /// <summary> 位移運算 a &gt;&gt; b        /// </summary>        Right,    }    /// <summary> 時間字段    /// </summary>    [Serializable]    public enum DateTimeField    {        /// <summary>/// </summary>        Year,        /// <summary>/// </summary>        Month,        /// <summary>/// </summary>        Day,        /// <summary>/// </summary>        Hour,        /// <summary>/// </summary>        Minute,        /// <summary>/// </summary>        Second,        /// <summary> 星期        /// </summary>        Week,    }
其他枚舉

 

再來一個已實現的MsSqlSaw

    public class MsSqlSaw : BaseSaw    {        public static MsSqlSaw Instance = new MsSqlSaw();        private MsSqlSaw() : base(System.Data.SqlClient.SqlClientFactory.Instance) { }        private static HashSet<string> KeyWords = InitKeyWords();        private static HashSet<string> InitKeyWords()        {            return new HashSet<string>("ABSOLUTE,ACTION,ADA,ADD,ADMIN,AFTER,AGGREGATE,ALIAS,ALL,ALLOCATE,ALTER,AND,ANY,ARE,ARRAY,AS,ASC,ASSERTION,AT,AUTHORIZATION,AVG,BACKUP,BEFORE,BEGIN,BETWEEN,BINARY,BIT,BIT_LENGTH,BLOB,BOOLEAN,BOTH,BREADTH,BREAK,BROWSE,BULK,BY,CALL,CASCADE,CASCADED,CASE,CAST,CATALOG,CHAR,CHARACTER,CHARACTER_LENGTH,CHAR_LENGTH,CHECK,CHECKPOINT,CLASS,CLOB,CLOSE,CLUSTERED,COALESCE,COLLATE,COLLATION,COLUMN,COMMIT,COMPLETION,COMPUTE,CONNECT,CONNECTION,CONSTRAINT,CONSTRAINTS,CONSTRUCTOR,CONTAINS,CONTAINSTABLE,CONTINUE,CONVERT,CORRESPONDING,COUNT,CREATE,CROSS,CUBE,CURRENT,CURRENT_DATE,CURRENT_PATH,CURRENT_ROLE,CURRENT_TIME,CURRENT_TIMESTAMP,CURRENT_USER,CURSOR,CYCLE,DATA,DATABASE,DATE,DAY,DBCC,DEALLOCATE,DEC,DECIMAL,DECLARE,DEFAULT,DEFERRABLE,DEFERRED,DELETE,DENY,DEPTH,DEREF,DESC,DESCRIBE,DESCRIPTOR,DESTROY,DESTRUCTOR,DETERMINISTIC,DIAGNOSTICS,DICTIONARY,DISCONNECT,DISK,DISTINCT,DISTRIBUTED,DOMAIN,DOUBLE,DROP,DUMMY,DUMP,DYNAMIC,EACH,ELSE,END,END-EXEC,EQUALS,ERRLVL,ESCAPE,EVERY,EXCEPT,EXCEPTION,EXEC,EXECUTE,EXISTS,EXIT,EXTERNAL,EXTRACT,FALSE,FETCH,FILE,FILLFACTOR,FIRST,FLASE,FLOAT,FOR,FOREIGN,FORTRAN,FOUND,FREE,FREETEXT,FREETEXTTABLE,FROM,FULL,FUNCTION,GENERAL,GET,GLOBAL,GO,GOTO,GRANT,GROUP,GROUPING,HAVING,HOLDLOCK,HOST,HOUR,IDENTITY,IDENTITYCOL,IDENTITY_INSERT,IF,IGNORE,IMMEDIATE,IN,INCLUDE,INDEX,INDICATOR,INITIALIZE,INITIALLY,INNER,INOUT,INPUT,INSENSITIVE,INSERT,INT,INTEGER,INTERSECT,INTERVAL,INTO,IS,ISOLATION,ITERATE,JOIN,KEY,KILL,LANGUAGE,LARGE,LAST,LATERAL,LEADING,LEFT,LESS,LEVEL,LIKE,LIMIT,LINENO,LOAD,LOCAL,LOCALTIME,LOCALTIMESTAMP,LOCATOR,LOWER,MAP,MATCH,MAX,MIN,MINUTE,MODIFIES,MODIFY,MODULE,MONTH,NAMES,NATIONAL,NATURAL,NCHAR,NCLOB,NEW,NEXT,NO,NOCHECK,NONCLUSTERED,NONE,NOT,NULL,NULLIF,NUMERIC,OBJECT,OCTET_LENGTH,OF,OFF,OFFSETS,OLD,ON,ONLY,OPEN,OPENDATASOURCE,OPENQUERY,OPENROWSET,OPENxml,OPERATION,OPTION,OR,ORDER,ORDINALITY,OUT,OUTER,OUTPUT,OVER,OVERLAPS,PAD,PARAMETER,PARAMETERS,PARTIAL,PASCAL,PATH,PERCENT,PLAN,POSITION,POSTFIX,PRECISION,PREFIX,PREORDER,PREPARE,PRESERVE,PRIMARY,PRINT,PRIOR,PRIVILEGES,PROC,PROCEDURE,PUBLIC,RAISERROR,READ,READS,READTEXT,REAL,RECONFIGURE,RECURSIVE,REF,REFERENCES,REFERENCING,RELATIVE,REPLICATION,RESTORE,RESTRICT,RESULT,RETURN,RETURNS,REVOKE,RIGHT,ROLE,ROLLBACK,ROLLUP,ROUTINE,ROW,ROWCOUNT,ROWGUIDCOL,ROWS,RULE,SAVE,SAVEPOINT,SCHEMA,SCOPE,SCROLL,SEARCH,SECOND,SECTION,SELECT,SEQUENCE,session,SESSION_USER,SET,SETS,SETUSER,SHUTDOWN,SIZE,SMALLINT,SOME,SPACE,SPECIFIC,SPECIFICTYPE,SQL,SQLCA,SQLCODE,SQLERROR,SQLEXCEPTION,SQLSTATE,SQLWARNING,START,STATE,STATEMENT,STATIC,STATISTICS,STRUCTURE,SUBSTRING,SUM,SYSTEM_USER,TABLE,TEMPORARY,TERMINATE,TEXTSIZE,THAN,THEN,TIME,TIMESTAMP,TIMEZONE_HOUR,TIMEZONE_MINUTE,TO,TOP,TRAILING,TRAN,TRANSACTION,TRANSLATE,TRANSLATION,TREAT,TRIGGER,TRIM,TRUE,TRUNCATE,TSEQUAL,UNDER,UNION,UNIQUE,UNKNOWN,UNNEST,UPDATE,UPDATETEXT,UPPER,USAGE,USE,USER,USING,VALUE,VALUES,VARCHAR,VARIABLE,VARYING,VIEW,WAITFOR,WHEN,WHENEVER,WHERE,WHILE,WITH,WITHOUT,WORK,WRITE,WRITETEXT,YEAR,ZONE".Split(','), StringComparer.OrdinalIgnoreCase);        }        protected override string TableName(Type type)        {            var name = type.Name;            if (KeyWords.Contains(name))            {                return string.Concat("[", name, "]");            }            return name;        }        protected override string ColumnName(MemberInfo member)        {            var name = member.Name;            if (KeyWords.Contains(name))            {                return string.Concat("[", name, "]");            }            return name;        }        protected override string ParameterPreFix { get { return "@"; } }        protected override string TimeNow { get { return "GETDATE()"; } }        protected override string LikeOperation(string val1, string val2, LikeOperator opt)        {            switch (opt)            {                case LikeOperator.Contains:                    return string.Concat(val1, " LIKE '%' + ", val2, " + '%'");                case LikeOperator.StartWith:                    return string.Concat(val1, " LIKE ", val2, " + '%'");                case LikeOperator.EndWith:                    return string.Concat(val1, " LIKE '%' + ", val2);                case LikeOperator.NotContains:                    return string.Concat(val1, " NOT LIKE '%' + ", val2, " + '%'");                case LikeOperator.NotStartWith:                    return string.Concat(val1, " NOT LIKE ", val2, " + '%'");                case LikeOperator.NotEndWith:                    return string.Concat(val1, " NOT LIKE '%' + ", val2);                default:                    throw new ArgumentOutOfRangeException("opt");            }        }        protected override string BitOperation(string val1, string val2, BitOperator opt)        {            switch (opt)            {                case BitOperator.And:                    return string.Concat(val1, " & ", val2);                case BitOperator.Or:                    return string.Concat(val1, " | ", val2);                case BitOperator.Xor:                    return string.Concat(val1, " ^ ", val2);                default:                    throw new ArgumentOutOfRangeException("opt");            }        }        protected override string StringTrim(string target, string arg)        {            if (arg != null)            {                throw new NotSupportedException("不支持參數");            }            return string.Concat("LTRIM(RTRIM(", target, "))");        }        protected override string StringTrimEnd(string target, string arg)        {            if (arg != null)            {                throw new NotSupportedException("不支持參數");            }            return string.Concat("RTRIM(", target, ")");        }        protected override string StringTrimStart(string target, string arg)        {            if (arg != null)            {                throw new NotSupportedException("不支持參數");            }            return string.Concat("LTRIM(", target, ")");        }        protected override string StringLength(string target)        {            return string.Concat("LEN(", target, ")");        }        protected override string SrtingToNumber(string target)        {            return string.Concat("CAST(", target, " as decimal)");        }        protected override string ObjectToString(DustType type, string target, string format)        {            switch (type)            {                case DustType.Undefined:                    break;                case DustType.Sql:                    break;                case DustType.Object:                    break;                case DustType.Number:                    if (format != null)                    {                        throw new NotSupportedException("不支持參數");                    }                    return string.Concat("CAST(", target, " as NVARCHAR)");                case DustType.Array:                    break;                case DustType.Boolean:                    break;                case DustType.DateTime:                    switch (format)                    {                        case "'HH:mm'":                            return string.Concat("CONVERT(VARCHAR(5),", target, ",114)");                        case "'HH:mm:ss'":                            return string.Concat("CONVERT(VARCHAR(8),", target, ",114)");                        case "'HH:mm:ss.fff'":                            return string.Concat("CONVERT(VARCHAR(12),", target, ",114)");                        case "'yyyy-MM-dd'":                            return string.Concat("CONVERT(VARCHAR(10),", target, ",21)");                        case "'yyyy-MM-dd HH:mm'":                            return string.Concat("CONVERT(VARCHAR(16),", target, ",21)");                        case "'yyyy-MM-dd HH:mm:ss'":                            return string.Concat("CONVERT(VARCHAR(19),", target, ",21)");                        case "'yyyy-MM-dd HH:mm:ss.fff'":                            return string.Concat("CONVERT(VARCHAR(23),", target, ",21)");                        case "'yy/MM/dd'":                            return string.Concat("CONVERT(VARCHAR(8),", target, ",111)");                        case "'yyMMdd'":                            return string.Concat("CONVERT(VARCHAR(6),", target, ",112)");                        default:                            break;                    }                    throw new NotSupportedException("不支持當前參數");                case DustType.Binary:                    break;                case DustType.String:                    break;                default:                    break;            }            return base.ObjectToString(type, target, format);        }        protected override string DateTimeToField(string datetime, DateTimeField field)        {            switch (field)            {                case DateTimeField.Year:                    return string.Concat("DATEPART(YYYY, ", datetime, ")");                case DateTimeField.Month:                    return string.Concat("DATEPART(mm, ", datetime, ")");                case DateTimeField.Day:                    return string.Concat("DATEPART(dd, ", datetime, ")");                case DateTimeField.Hour:                    return string.Concat("DATEPART(hh, ", datetime, ")");                case DateTimeField.Minute:                    return string.Concat("DATEPART(mi, ", datetime, ")");                case DateTimeField.Second:                    return string.Concat("DATEPART(ss, ", datetime, ")");                case DateTimeField.Week:                    return string.Concat("(DATEPART(w, ", datetime, ") - 1)");                default:                    throw new ArgumentOutOfRangeException("field");            }        }    }
MsSqlSaw

 

部分解釋結果展示(以OracleSaw為例)

下載地址

https://code.csdn.net/jy02305022/blqw-faller

廣告

對C#感興趣的朋友可以來群里討論,入群方式見簽名


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 祁东县| 沅陵县| 莱西市| 屯昌县| 康定县| 孙吴县| 徐汇区| 皮山县| 保德县| 方城县| 怀柔区| 石首市| 西城区| 胶州市| 齐河县| 自治县| 博客| 尚义县| 大安市| 宝丰县| 洪湖市| 金湖县| 玉山县| 涞源县| 夹江县| 乐安县| 绥滨县| 伊宁市| 抚州市| 靖远县| 安陆市| 昂仁县| 全椒县| 孝昌县| 丰都县| 西和县| 独山县| 盘山县| 徐水县| 平南县| 全南县|