PageRenderTime 81ms CodeModel.GetById 30ms RepoModel.GetById 1ms app.codeStats 0ms

/Kwan/Data/Expression.cs

#
C# | 421 lines | 398 code | 20 blank | 3 comment | 48 complexity | b2adaadd9a8cf90ad5a229b694d3b5f7 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace Kwan.Data
  5. {
  6. /// <summary>
  7. /// 条件表达式
  8. /// </summary>
  9. [Serializable]
  10. public partial class Expression
  11. {
  12. public Expression()
  13. {
  14. }
  15. private List<Command.Parameter> mParameters = new List<Command.Parameter>();
  16. public List<Command.Parameter> Parameters
  17. {
  18. get
  19. {
  20. return mParameters;
  21. }
  22. }
  23. private StringBuilder mSqlText = new StringBuilder();
  24. public StringBuilder SqlText
  25. {
  26. get
  27. {
  28. return mSqlText;
  29. }
  30. }
  31. internal void Parse(Command cmd)
  32. {
  33. if (SqlText.Length > 0)
  34. {
  35. cmd.Text.Append(" where " + SqlText.ToString());
  36. foreach (Command.Parameter p in Parameters)
  37. {
  38. cmd.AddParameter(p);
  39. }
  40. }
  41. }
  42. public static Expression operator &(Expression exp1, Expression exp2)
  43. {
  44. if (exp1 == null || exp1.SqlText.Length == 0)
  45. return exp2;
  46. if (exp2 == null || exp2.SqlText.Length == 0)
  47. return exp1;
  48. Expression exp = new Expression();
  49. exp.SqlText.Append("(");
  50. exp.SqlText.Append(exp1.ToString());
  51. exp.SqlText.Append(")");
  52. exp.Parameters.AddRange(exp1.Parameters);
  53. exp.SqlText.Append(" and (");
  54. exp.SqlText.Append(exp2.SqlText.ToString());
  55. exp.SqlText.Append(")");
  56. exp.Parameters.AddRange(exp2.Parameters);
  57. return exp;
  58. }
  59. public static Expression operator |(Expression exp1, Expression exp2)
  60. {
  61. if (exp1 == null || exp1.SqlText.Length == 0)
  62. return exp2;
  63. if (exp2 == null || exp2.SqlText.Length == 0)
  64. return exp1;
  65. Expression exp = new Expression();
  66. exp.SqlText.Append("(");
  67. exp.SqlText.Append(exp1.ToString());
  68. exp.SqlText.Append(")");
  69. exp.Parameters.AddRange(exp1.Parameters);
  70. exp.SqlText.Append(" or (");
  71. exp.SqlText.Append(exp2.SqlText.ToString());
  72. exp.SqlText.Append(")");
  73. exp.Parameters.AddRange(exp2.Parameters);
  74. return exp;
  75. }
  76. internal static string GetParamName()
  77. {
  78. ParamNameSeed pns = NameSeed;
  79. if (pns.Value > 200)
  80. pns.Value = 0;
  81. else
  82. pns.Value++;
  83. return "p" + pns.Value;
  84. }
  85. [ThreadStatic]
  86. static ParamNameSeed mNameSeed = new ParamNameSeed();
  87. internal static ParamNameSeed NameSeed
  88. {
  89. get
  90. {
  91. if (mNameSeed == null)
  92. mNameSeed = new ParamNameSeed();
  93. return mNameSeed;
  94. }
  95. }
  96. internal class ParamNameSeed
  97. {
  98. public int Value
  99. {
  100. get;
  101. set;
  102. }
  103. }
  104. public override string ToString()
  105. {
  106. return SqlText.ToString();
  107. }
  108. }
  109. public class FieldInfo
  110. {
  111. public FieldInfo(string table, string name)
  112. {
  113. DBContext.Init();
  114. mTable = table;
  115. mName = name;
  116. }
  117. private string mTable;
  118. public string Table
  119. {
  120. get
  121. {
  122. return mTable;
  123. }
  124. }
  125. private string mName;
  126. public string Name
  127. {
  128. get
  129. {
  130. return mName;
  131. }
  132. }
  133. public Expression Eq(object value)
  134. {
  135. string p = Expression.GetParamName();
  136. Expression exp = new Expression();
  137. exp.SqlText.Append(string.Format(" {0}=@{1} ",Name,p));
  138. exp.Parameters.Add(new Command.Parameter{ Name=p,
  139. Value=Mappings.PropertyCastAttribute.CastValue(Table,Name, value)});
  140. return exp;
  141. }
  142. public Expression LtEq(object value)
  143. {
  144. string p = Expression.GetParamName();
  145. Expression exp = new Expression();
  146. exp.SqlText.Append(string.Format(" {0}<=@{1} ", Name, p));
  147. exp.Parameters.Add(new Command.Parameter { Name = p,
  148. Value = Mappings.PropertyCastAttribute.CastValue(Table, Name, value)
  149. });
  150. return exp;
  151. }
  152. public Expression Lt(object value)
  153. {
  154. string p = Expression.GetParamName();
  155. Expression exp = new Expression();
  156. exp.SqlText.Append(string.Format(" {0}<@{1} ", Name, p));
  157. exp.Parameters.Add(new Command.Parameter { Name = p,
  158. Value = Mappings.PropertyCastAttribute.CastValue(Table, Name, value)
  159. });
  160. return exp;
  161. }
  162. public Expression Gt(object value)
  163. {
  164. string p = Expression.GetParamName();
  165. Expression exp = new Expression();
  166. exp.SqlText.Append(string.Format(" {0}>@{1} ", Name, p));
  167. exp.Parameters.Add(new Command.Parameter { Name = p,
  168. Value = Mappings.PropertyCastAttribute.CastValue(Table, Name, value)
  169. });
  170. return exp;
  171. }
  172. public Expression GtEq(object value)
  173. {
  174. string p = Expression.GetParamName();
  175. Expression exp = new Expression();
  176. exp.SqlText.Append(string.Format(" {0}>=@{1} ", Name, p));
  177. exp.Parameters.Add(new Command.Parameter { Name = p, Value = Mappings.PropertyCastAttribute.CastValue(Table, Name, value) });
  178. return exp;
  179. }
  180. public Expression NotEq(object value)
  181. {
  182. string p = Expression.GetParamName();
  183. Expression exp = new Expression();
  184. exp.SqlText.Append(string.Format(" {0}<>@{1} ", Name, p));
  185. exp.Parameters.Add(new Command.Parameter { Name = p, Value = Mappings.PropertyCastAttribute.CastValue(Table, Name, value) });
  186. return exp;
  187. }
  188. public Expression In(System.Collections.IEnumerable values)
  189. {
  190. string p;
  191. int i = 0;
  192. Expression exp = new Expression();
  193. exp.SqlText.Append(" " + Name + " in (");
  194. foreach (object value in values)
  195. {
  196. p = Expression.GetParamName();
  197. if (i > 0)
  198. exp.SqlText.Append(",");
  199. exp.SqlText.Append("@" + p);
  200. exp.Parameters.Add(new Command.Parameter { Name = p, Value = Mappings.PropertyCastAttribute.CastValue(Table, Name, value) });
  201. i++;
  202. }
  203. exp.SqlText.Append(" )");
  204. return exp;
  205. }
  206. public Expression In(FieldInfo field, Expression expression)
  207. {
  208. Expression exp = new Expression();
  209. string astable = "T" + Expression.GetParamName();
  210. exp.SqlText.Append(" " + Name + " in (select "+astable+"."+ field.Name+" from "+ field.Table+" "+astable);
  211. if (expression != null && expression.SqlText.Length > 0)
  212. {
  213. exp.SqlText.Append(" where " + expression.SqlText.ToString());
  214. exp.Parameters.AddRange(expression.Parameters);
  215. }
  216. exp.SqlText.Append(")");
  217. return exp;
  218. }
  219. public Expression NotIn(System.Collections.IEnumerable values)
  220. {
  221. string p;
  222. int i = 0;
  223. Expression exp = new Expression();
  224. exp.SqlText.Append(" " + Name + " not in (");
  225. foreach (object value in values)
  226. {
  227. p = Expression.GetParamName();
  228. if (i > 0)
  229. exp.SqlText.Append(",");
  230. exp.SqlText.Append("@" + p);
  231. exp.Parameters.Add(new Command.Parameter { Name = p, Value = Mappings.PropertyCastAttribute.CastValue(Table, Name, value) });
  232. i++;
  233. }
  234. exp.SqlText.Append(")");
  235. return exp;
  236. }
  237. public Expression NotIn(FieldInfo field, Expression expression)
  238. {
  239. Expression exp = new Expression();
  240. string astable = "T" + Expression.GetParamName();
  241. exp.SqlText.Append(" " + Name + " not in (select " + astable + "." + field.Name + " from " + field.Table + " " + astable);
  242. if (expression != null && expression.SqlText.Length > 0)
  243. {
  244. exp.SqlText.Append(" where " + expression.SqlText.ToString());
  245. exp.Parameters.AddRange(expression.Parameters);
  246. }
  247. exp.SqlText.Append(")");
  248. return exp;
  249. }
  250. public Expression Between(object fromvalue, object tovalue)
  251. {
  252. string p, p1;
  253. p = Expression.GetParamName();
  254. p1 = Expression.GetParamName();
  255. Expression exp = new Expression();
  256. exp.SqlText.Append( string.Format(" {0} Between @{1} and @{2}", Name, p, p1));
  257. exp.Parameters.Add(new Command.Parameter { Name = p, Value = Mappings.PropertyCastAttribute.CastValue(Table, Name, fromvalue) });
  258. exp.Parameters.Add(new Command.Parameter { Name = p1, Value = Mappings.PropertyCastAttribute.CastValue(Table, Name, tovalue) });
  259. return exp;
  260. }
  261. public Expression NotBetween(object fromvalue, object tovalue)
  262. {
  263. string p, p1;
  264. p = Expression.GetParamName();
  265. p1 = Expression.GetParamName();
  266. Expression exp = new Expression();
  267. exp.SqlText.Append(string.Format(" {0} not Between @{1} and @{2}", Name, p, p1));
  268. exp.Parameters.Add(new Command.Parameter { Name = p, Value = Mappings.PropertyCastAttribute.CastValue(Table, Name, fromvalue) });
  269. exp.Parameters.Add(new Command.Parameter { Name = p1, Value = Mappings.PropertyCastAttribute.CastValue(Table, Name, tovalue) });
  270. return exp;
  271. }
  272. public Expression Like(object value)
  273. {
  274. if (value != null && value is System.Collections.IEnumerable && value.GetType() != typeof(string))
  275. return LikeMany((System.Collections.IEnumerable)value);
  276. string pn = Expression.GetParamName();
  277. Expression exp = new Expression();
  278. exp.SqlText.Append(
  279. string.Format("{0} like @{1}", Name, pn)
  280. );
  281. exp.Parameters.Add(new Command.Parameter { Name = pn, Value = Mappings.PropertyCastAttribute.CastValue(Table, Name, value) });
  282. return exp;
  283. }
  284. private Expression LikeMany(System.Collections.IEnumerable value)
  285. {
  286. Expression exp = new Expression();
  287. int i = 0;
  288. string pn;
  289. exp.SqlText.Append("(");
  290. foreach (object item in value)
  291. {
  292. pn = Expression.GetParamName();
  293. if (i > 0)
  294. exp.SqlText.Append(" or ");
  295. exp.SqlText.Append(Name +" like @"+pn);
  296. exp.Parameters.Add(new Command.Parameter { Name = pn, Value = Mappings.PropertyCastAttribute.CastValue(Table, Name, item) });
  297. i++;
  298. }
  299. exp.SqlText.Append(")");
  300. return exp;
  301. }
  302. public Expression Match(object value)
  303. {
  304. if (value != null && value is System.Collections.IEnumerable && value.GetType() !=typeof(string))
  305. return MatchMany((System.Collections.IEnumerable)value);
  306. return Like("%" + value + "%");
  307. }
  308. private Expression MatchMany(System.Collections.IEnumerable value)
  309. {
  310. Expression exp = new Expression();
  311. int i = 0;
  312. string pn;
  313. exp.SqlText.Append("(");
  314. foreach (object item in value)
  315. {
  316. pn = Expression.GetParamName();
  317. if (i > 0)
  318. exp.SqlText.Append(" or ");
  319. exp.SqlText.Append(Name + " like @" + pn);
  320. exp.Parameters.Add(new Command.Parameter { Name = pn, Value = "%"+item+"%" });
  321. i++;
  322. }
  323. exp.SqlText.Append(")");
  324. return exp;
  325. }
  326. public Expression IsNull()
  327. {
  328. Expression exp = new Expression();
  329. exp.SqlText.Append(" "+Name+" is null");
  330. return exp;
  331. }
  332. public Expression IsNotNull()
  333. {
  334. Expression exp = new Expression();
  335. exp.SqlText.Append(" " + Name + " is not null");
  336. return exp;
  337. }
  338. public override string ToString()
  339. {
  340. return Name;
  341. }
  342. public static Expression operator ==(FieldInfo field, object value)
  343. {
  344. if (value == null)
  345. return field.IsNull();
  346. if (value is System.Collections.IEnumerable && value.GetType() !=typeof(string))
  347. return field.In((System.Collections.IEnumerable)value);
  348. return field.Eq(value);
  349. }
  350. public static Expression operator !=(FieldInfo field, object value)
  351. {
  352. if (value == null)
  353. return field.IsNotNull();
  354. if (value is System.Collections.IEnumerable && value.GetType() != typeof(string))
  355. return field.NotIn((System.Collections.IEnumerable)value);
  356. return field.NotEq(value);
  357. }
  358. public static Expression operator >(FieldInfo field, object value)
  359. {
  360. return field.Gt(value);
  361. }
  362. public static Expression operator >=(FieldInfo field, object value)
  363. {
  364. return field.GtEq(value);
  365. }
  366. public static Expression operator <(FieldInfo field, object value)
  367. {
  368. return field.Lt(value);
  369. }
  370. public static Expression operator <=(FieldInfo field, object value)
  371. {
  372. return field.LtEq(value);
  373. }
  374. public FieldInfo At()
  375. {
  376. return new FieldInfo(Table, Table + "." + Name);
  377. }
  378. public FieldInfo At(string table)
  379. {
  380. return new FieldInfo(table, table + "." + Name);
  381. }
  382. public string Desc
  383. {
  384. get
  385. {
  386. return Name + " desc ";
  387. }
  388. }
  389. public string Asc
  390. {
  391. get
  392. {
  393. return Name + " asc ";
  394. }
  395. }
  396. public Field NewValue(object value)
  397. {
  398. return new Field { Name = Name, Value = Mappings.PropertyCastAttribute.CastValue(Table, Name, value) };
  399. }
  400. }
  401. }