PageRenderTime 54ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/CoolCode/trunk/src/Framework/CoolCode.Data.Xml/Table.cs

http://net.codeplex.com
C# | 272 lines | 150 code | 40 blank | 82 comment | 14 complexity | 80377a107dbbd7c7c3f4a458b5256c24 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Data.Linq;
  6. using System.Xml.Linq;
  7. using System.Reflection;
  8. using System.Linq.Expressions;
  9. using CoolCode.Reflection;
  10. using CoolCode.Caching;
  11. namespace CoolCode.Data.Xml
  12. {
  13. class Table<T> : XmlQueryable<T>, ITable<T>, IXmlTable
  14. {
  15. public XElement Root { get; set; }
  16. public bool IsChanged { get; set; }
  17. public string ClassName { get; set; }
  18. private static ICacheStrategy typeCache ;
  19. private IDataContext context;
  20. public Table(IDataContext context)
  21. : base(context)
  22. {
  23. //Root = TableFactory.Instance.GetRoot<T>(context.ConnectionString );
  24. //className = typeof(T).Name;
  25. this.context = context;
  26. if(typeCache ==null)
  27. typeCache =new HashCacheStrategy();
  28. }
  29. public void Store(T TEntity)
  30. {
  31. //string[] primaryKeys = BLReflection.GetPropFrom<System.Data.Linq.Mapping.ColumnAttribute, T>(c => c.IsPrimaryKey);
  32. //if ((typeof(T).Name == "IEnumerable`1"))
  33. // StoreAll(TEntity );
  34. SaveByPrimaryKeys(TEntity);
  35. IsChanged = true;
  36. }
  37. public void Delete(T TEntity)
  38. {
  39. DeleteByPrimaryKeys(TEntity);
  40. IsChanged = true;
  41. }
  42. public void StoreAll(IEnumerable<T> TList)
  43. {
  44. foreach (T TEntity in TList)
  45. {
  46. var xe = XmlConvert.Entity2Xml<T>(TEntity);
  47. Root.Add(xe);
  48. }
  49. IsChanged = true;
  50. }
  51. public void DeleteAll(IEnumerable<T> TList)
  52. {
  53. //Get PrimaryKeys
  54. string[] primaryKeys = typeCache.GetItem<T>("ColumnAttribute") as string[];
  55. if (primaryKeys == null)
  56. {
  57. primaryKeys = BLReflection.GetPropFrom<System.Data.Linq.Mapping.ColumnAttribute, T>(c => c.IsPrimaryKey);
  58. typeCache.AddItem<T>(primaryKeys, "ColumnAttribute");
  59. }
  60. int len = primaryKeys.Length;
  61. string[] pkValue = new string[len];
  62. //Initial Expression
  63. // instance
  64. ParameterExpression s = Expression.Parameter(typeof(XElement), "s");
  65. // method
  66. var m = typeof(XElement).GetMethod("Element", new Type[] { typeof(XName) });
  67. Expression cond = Expression.Constant(false);
  68. // Expression condTrue = Expression.Constant(true );
  69. MemberExpression[] props = new MemberExpression[len];
  70. for (int i = 0; i < len; i++)
  71. {
  72. var mcall = Expression.Call(s, m,
  73. new Expression[] { Expression.Constant((XName)primaryKeys[i], typeof(XName)) } // arguments
  74. );
  75. props[i] = Expression.Property(mcall, "Value");
  76. }
  77. //Join Expression
  78. foreach (var TEntity in TList)
  79. {
  80. Expression subcond=null;
  81. for (int i = 0; i < len; i++)
  82. {
  83. //Method 1: Get Property and cache it for reuse
  84. var p = typeCache.GetItem<T>("Property" + primaryKeys[i]) as PropertyInfo;
  85. if (p == null)
  86. {
  87. Type t = typeof(T);
  88. p = t.GetProperty(primaryKeys[i]);
  89. typeCache.AddItem<T>(p, "Property" + primaryKeys[i]);
  90. }
  91. pkValue[i] = XmlConvert.SerializeObject(p.GetValue(TEntity, null));
  92. //Method 2: Get Property directly every time
  93. // pkValue[i] = XmlConvert.SerializeObject(BLReflection.GetPropValue(TEntity, primaryKeys[i]));
  94. //Join Condition
  95. var value = Expression.Constant(pkValue[i], typeof(string));
  96. if (i == 0)
  97. subcond = BinaryExpression.Equal(props[i], value);
  98. else
  99. subcond = BinaryExpression.AndAlso(subcond, BinaryExpression.Equal(props[i], value));
  100. }
  101. cond = BinaryExpression.OrElse(cond,subcond);
  102. }
  103. // lambda
  104. var lambda = Expression.Lambda<Func<XElement, bool>>(cond, new ParameterExpression[] { s });
  105. var xe = Root.Descendants(ClassName).Where(lambda.Compile());
  106. xe.Remove();
  107. IsChanged = true;
  108. }
  109. public void Delete(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
  110. {
  111. var query = XmlContext.Query<T>(predicate, this.context);
  112. query.Remove();
  113. IsChanged = true;
  114. }
  115. public void DeleteAll(System.Linq.Expressions.Expression<Func<XElement, bool>> predicate)
  116. {
  117. ConditionBuilder cond = new ConditionBuilder(predicate);
  118. var result = cond.Result as System.Linq.Expressions.Expression<Func<XElement, bool>>;
  119. var query = Root.Descendants(ClassName).Where(result.Compile());
  120. query.Remove();
  121. IsChanged = true;
  122. }
  123. private void DeleteByPrimaryKeys(T TEntity)
  124. {
  125. //var table = TableFactory.Instance.GetTable<T>(Path);
  126. //var className = table.Name;
  127. //var root = table.Root;
  128. //var fileName = table.FileName;
  129. //string[] primaryKeys = typeCache.GetItem<T>("ColumnAttribute") as string[];
  130. //if (primaryKeys == null)
  131. //{
  132. // primaryKeys = BLReflection.GetPropFrom<System.Data.Linq.Mapping.ColumnAttribute, T>(c => c.IsPrimaryKey);
  133. // typeCache.AddItem<T>(primaryKeys, "ColumnAttribute");
  134. //}
  135. //var pkValue = new string[primaryKeys.Length];
  136. //for (int i = 0; i < primaryKeys.Length; i++)
  137. //{
  138. // pkValue[i] = XmlConvert.SerializeObject(BLReflection.GetPropValue(TEntity, primaryKeys[i]));
  139. //}
  140. //ETBuilder builder = new ETBuilder();
  141. //var cond = builder.Where(primaryKeys, pkValue).Compile();
  142. ////var xeDuplicate = root.Descendants(className).Where(c => PrimaryKeyExpression(c, TEntity));
  143. //var xeDuplicate = root.Descendants(className).Where(cond);
  144. //xeDuplicate.Remove();
  145. //var table = TableFactory.Instance.GetTable<T>(Path);
  146. //var className = table.Name;
  147. //var root = table.Root;
  148. //var fileName = table.FileName;
  149. //var xe = Root.Descendants(ClassName).Single(c => PrimaryKeyExpression(c, TEntity));
  150. var cond = PrimaryKeyExpression(TEntity);
  151. var xe = Root.Descendants(ClassName).Where(cond);
  152. xe.Remove();
  153. }
  154. private void SaveByPrimaryKeys(T TEntity)
  155. {
  156. //var table = TableFactory.Instance.GetTable<T>(Path);
  157. //var className = table.Name;
  158. //var root = table.Root;
  159. //var fileName = table.FileName;
  160. //string[] primaryKeys = typeCache.GetItem<T>("ColumnAttribute") as string[];
  161. //if (primaryKeys == null)
  162. //{
  163. // primaryKeys = BLReflection.GetPropFrom<System.Data.Linq.Mapping.ColumnAttribute, T>(c => c.IsPrimaryKey);
  164. // typeCache.AddItem<T>(primaryKeys, "ColumnAttribute");
  165. //}
  166. //var pkValue = new string[primaryKeys.Length];
  167. //for (int i = 0; i < primaryKeys.Length; i++)
  168. //{
  169. // pkValue[i] = XmlConvert.SerializeObject(BLReflection.GetPropValue(TEntity, primaryKeys[i]));
  170. //}
  171. //ETBuilder builder = new ETBuilder();
  172. //var cond = builder.Where(primaryKeys, pkValue).Compile();
  173. ////var xeDuplicate = root.Descendants(className).Where(c => PrimaryKeyExpression(c, TEntity));
  174. //var xeDuplicate = root.Descendants(className).Where(cond);
  175. //xeDuplicate.Remove();
  176. DeleteByPrimaryKeys(TEntity);
  177. var xe = XmlConvert.Entity2Xml<T>(TEntity);
  178. Root.Add(xe);
  179. //root.Save(fileName);
  180. }
  181. private Func<XElement, bool> PrimaryKeyExpression(T TEntity)
  182. {
  183. //string[] primaryKeys = BLReflection.GetPropFrom<System.Data.Linq.Mapping.ColumnAttribute, T>(c => c.IsPrimaryKey);
  184. string[] primaryKeys = typeCache.GetItem<T>("ColumnAttribute") as string[];
  185. if (primaryKeys == null)
  186. {
  187. primaryKeys = BLReflection.GetPropFrom<System.Data.Linq.Mapping.ColumnAttribute, T>(c => c.IsPrimaryKey);
  188. typeCache.AddItem<T>(primaryKeys, "ColumnAttribute");
  189. }
  190. return PrimaryKeyExpression(TEntity, primaryKeys);
  191. }
  192. private Func<XElement, bool> PrimaryKeyExpression(T TEntity, string[] primaryKeys)
  193. {
  194. var pkValue = new string[primaryKeys.Length];
  195. //bool compare;
  196. //for (int i = 0; i < primaryKeys.Length; i++)
  197. //{
  198. // pkValue[i] = BLReflection.GetPropValue(TEntity, primaryKeys[i]);
  199. // compare = IsEqual(x.Element(primaryKeys[i]).Value, pkValue[i]);
  200. // if (!compare)
  201. // return false;
  202. //}
  203. for (int i = 0; i < primaryKeys.Length; i++)
  204. {
  205. //Method 1: Get Property and cache it for reuse
  206. var p = typeCache.GetItem<T>("Property" + primaryKeys[i]) as PropertyInfo;
  207. if (p == null)
  208. {
  209. Type t = typeof(T);
  210. p = t.GetProperty(primaryKeys[i]);
  211. typeCache.AddItem<T>(p, "Property" + primaryKeys[i]);
  212. }
  213. pkValue[i] = XmlConvert.SerializeObject(p.GetValue(TEntity, null));
  214. //Method 2: Get Property directly every time
  215. // pkValue[i] = XmlConvert.SerializeObject(BLReflection.GetPropValue(TEntity, primaryKeys[i]));
  216. }
  217. ExpressionBuilder builder = new ExpressionBuilder();
  218. var cond = builder.Where(primaryKeys, pkValue).Compile();
  219. return cond;
  220. //var xeDuplicate = root.Descendants(className).Where(c => PrimaryKeyExpression(c, TEntity));
  221. //var xeDuplicate = Root.Descendants(ClassName).Where(cond);
  222. //xeDuplicate.Remove();
  223. //return true;
  224. }
  225. #region IEnumerable Members
  226. //public new System.Collections.IEnumerator GetEnumerator()
  227. //{
  228. // return base.GetEnumerator();
  229. //}
  230. #endregion
  231. }
  232. }