首页 > 代码库 > CRL数据映射工作原理

CRL数据映射工作原理

CRL并不直接对数据库进行操作,它只会处理生成对应的SQL语句和参数,由委托注入的数据访问对象来执行,目前采用CoreHelper.SqlHelper

因此,需要在Gblobal中实现数据访问委托,在委托方法中,可根据type区分是由哪一个业务创建的委托,从而达到多数据库的实现

通过封装的数据结构检查方法,可以编程方式对数据库里表结构进行同步

整体过程如下

同理,如果需要增加多数据库类型支持,只需增加对应的数据库访问和查询语法转换即可(需改进增加接口,未来版本实现)

查询转换时,简单的逻辑运算可直接转为SQL,大于,小于,等于,或,但一些比较特殊的语法则需要借助扩展方法进行处理

扩展方法如下:

  1  /// <summary>  2     /// 查询扩展方法,请引用CRL命名空间  3     /// </summary>  4     public static partial class ExtensionMethod  5     {  6         /// <summary>  7         /// lamada传入方法,传入要查询的字段  8         /// 示例:b.SelectField(b.Id, b.Name)  9         /// </summary> 10         /// <param name="args"></param> 11         /// <returns></returns> 12         public static bool SelectField(this IModelBase s, params object[] args) 13         { 14             return true; 15         } 16         /// <summary> 17         /// Like("%key%") 18         /// </summary> 19         /// <param name="s"></param> 20         /// <param name="likeString"></param> 21         /// <returns></returns> 22         public static bool Like(this string s,string likeString) 23         { 24             if (string.IsNullOrEmpty(likeString)) 25                 throw new Exception("参数值不能为空:likeString"); 26             return s.IndexOf(likeString) > -1; 27         } 28         /// <summary> 29         /// NotLike("%key%") 30         /// </summary> 31         /// <param name="s"></param> 32         /// <param name="likeString"></param> 33         /// <returns></returns> 34         public static bool NotLike(this string s, string likeString) 35         { 36             if (string.IsNullOrEmpty(likeString)) 37                 throw new Exception("参数值不能为空:likeString"); 38             return s.IndexOf(likeString) == -1; 39         } 40         /// <summary> 41         /// 字符串 In("‘1312‘,‘123123‘") 42         /// </summary> 43         /// <param name="s"></param> 44         /// <param name="inString"></param> 45         /// <returns></returns> 46         public static bool In(this string s, string inString) 47         { 48             if (string.IsNullOrEmpty(inString)) 49                 throw new Exception("参数值不能为空:inString"); 50             return s.IndexOf(inString) > -1; 51         } 52         /// <summary> 53         /// 字符串 NotIn("‘1312‘,‘123123‘") 54         /// </summary> 55         /// <param name="s"></param> 56         /// <param name="inString"></param> 57         /// <returns></returns> 58         public static bool NotIn(this string s, string inString) 59         { 60             if (string.IsNullOrEmpty(inString)) 61                 throw new Exception("参数值不能为空:inString"); 62             return s.IndexOf(inString) == -1; 63         } 64         /// <summary> 65         /// 数字 In(12312,12312) 66         /// </summary> 67         /// <param name="s"></param> 68         /// <param name="values"></param> 69         /// <returns></returns> 70         public static bool In(this int s, params int[] values) 71         { 72             if (values==null) 73                 throw new Exception("参数值不能为空:inString"); 74             return true; 75         } 76         /// <summary> 77         /// 数字 NotIn(1231,1231) 78         /// </summary> 79         /// <param name="s"></param> 80         /// <param name="values"></param> 81         /// <returns></returns> 82         public static bool NotIn(this int s, params int[] values) 83         { 84             if (values == null) 85                 throw new Exception("参数值不能为空:inString"); 86             return true; 87         } 88         /// <summary> 89         /// 枚举转换为INT 90         /// </summary> 91         /// <param name="e"></param> 92         /// <returns></returns> 93         public static int ToInt(this Enum e) 94         { 95             return Convert.ToInt32(e); 96         } 97         public static bool Between(this DateTime time, DateTime begin, DateTime end) 98         { 99             return true;100         }101         /// <summary>102         /// 103         /// </summary>104         /// <param name="time"></param>105         /// <param name="format">比较方式,M,D,H</param>106         /// <param name="compareTime">比较时间</param>107         /// <param name="compare">如何比较, =0 >0</param>108         /// <returns></returns>109         public static bool DateDiff(this DateTime time, string format, DateTime compareTime, string compare)110         {111             return true;112         }113         public static bool ContainsString(this string str, string value)114         {115             return true;116         }117     }

调用示例 DateDiff

b => b.AddTime.DateDiff("d", date, "=0")

Like

b => b.Name.Like("%小明%")

由于Lamada解析问题,语法目前只能属性在左,变量在右,不然会引发解析出错,系统自带逻辑方法不会进行转换,使用后出会引发解析错误