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解析问题,语法目前只能属性在左,变量在右,不然会引发解析出错,系统自带逻辑方法不会进行转换,使用后出会引发解析错误
时间: 2024-10-12 21:53:44