EntityFrameworkCoreExtensions.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. using Microsoft.EntityFrameworkCore;
  2. using Microsoft.EntityFrameworkCore.Infrastructure;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.ComponentModel.DataAnnotations.Schema;
  6. using System.Data;
  7. using System.Data.Common;
  8. using System.Data.SqlClient;
  9. using System.Linq;
  10. using System.Reflection;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. namespace Ropin.Inspection.Repository
  14. {
  15. public static class EntityFrameworkCoreExtensions
  16. {
  17. private static DbCommand CreateCommand(DatabaseFacade facade, string sql, out DbConnection connection, params object[] parameters)
  18. {
  19. var conn = facade.GetDbConnection();
  20. connection = conn;
  21. conn.Open();
  22. var cmd = conn.CreateCommand();
  23. if (facade.IsMySql())
  24. {
  25. cmd.CommandText = sql;
  26. if(null != parameters)
  27. cmd.Parameters.AddRange(parameters);
  28. }
  29. return cmd;
  30. }
  31. public static DataTable SqlQuery(this DatabaseFacade facade, string sql, params object[] parameters)
  32. {
  33. DataTable dt = new DataTable();
  34. try
  35. {
  36. var command = CreateCommand(facade, sql, out DbConnection conn, parameters);
  37. var reader = command.ExecuteReader();
  38. dt.Load(reader);
  39. reader.Close();
  40. conn.Close();
  41. }
  42. catch(System.Data.DataException e)
  43. {
  44. System.Data.DataRow[] rowsInError;
  45. System.Text.StringBuilder sbError = new System.Text.StringBuilder();
  46. // Test if the table has errors. If not, skip it.
  47. if (dt.HasErrors)
  48. {
  49. // Get an array of all rows with errors.
  50. rowsInError = dt.GetErrors();
  51. // Print the error of each column in each row.
  52. for (int i = 0; i < rowsInError.Length; i++)
  53. {
  54. foreach (System.Data.DataColumn column in dt.Columns)
  55. {
  56. sbError.Append(column.ColumnName + " " + rowsInError[i].GetColumnError(column));
  57. }
  58. // Clear the row errors
  59. rowsInError[i].ClearErrors();
  60. }
  61. }
  62. string time = System.DateTime.Now.ToString();
  63. Console.WriteLine("======================");
  64. Console.WriteLine(time);
  65. Console.WriteLine("----------------------");
  66. Console.WriteLine(sbError.ToString());
  67. Console.WriteLine("----------------------");
  68. Console.WriteLine(e.ToString());
  69. }
  70. finally {
  71. }
  72. return dt;
  73. }
  74. public static DataTable SqlQuery2(this DatabaseFacade facade, string sql, params object[] parameters)
  75. {
  76. //using (SqlConnection connection = new SqlConnection("server=117.78.26.193;user id=root;password=Xhrz@2018;port=8635;persistsecurityinfo=True;database=JX_LH_Inspection;sslMode=None"))
  77. //{
  78. // DataSet ds = new DataSet();
  79. // connection.Open();
  80. // SqlDataAdapter command = new SqlDataAdapter(sql, connection);
  81. // command.Fill(ds);
  82. // return ds.Tables[0];
  83. //}
  84. //string data = string.Empty;
  85. var command = CreateCommand(facade, sql, out DbConnection conn, parameters);
  86. DataTable OutDataTable = new DataTable();
  87. var daReader = command.ExecuteReader();
  88. DataRow dataRow;
  89. //设置Table名和Column名
  90. OutDataTable.TableName = "Ropin";
  91. for (int j = 0; j < daReader.FieldCount; j++)
  92. {
  93. //获取列名
  94. OutDataTable.Columns.Add(daReader.GetName(j), daReader.GetFieldType(j));
  95. }
  96. //循环取数据集合中的数据,存到DataTable中
  97. do
  98. {
  99. while (daReader.Read())
  100. {
  101. dataRow = OutDataTable.NewRow();
  102. for (int j = 0; j < daReader.FieldCount; j++)
  103. {
  104. var data = daReader[j];
  105. dataRow[j] = data;
  106. }
  107. OutDataTable.Rows.Add(dataRow);
  108. }
  109. } while (daReader.NextResult());
  110. daReader.Close();
  111. conn.Close();
  112. return OutDataTable;
  113. }
  114. public static List<T> SqlQuery<T>(this DatabaseFacade facade, string sql, params object[] parameters) where T : class, new()
  115. {
  116. var dt = SqlQuery(facade, sql, parameters);
  117. return dt.ToList<T>();
  118. }
  119. public static List<T> SqlQuery2<T>(this DatabaseFacade facade, string sql, params object[] parameters) where T : class, new()
  120. {
  121. var dt = SqlQuery2(facade, sql, parameters);
  122. return dt.ToList<T>();
  123. }
  124. public static List<T> ToList<T>(this DataTable dt) where T : class, new()
  125. {
  126. var propertyInfos = typeof(T).GetProperties();
  127. var list = new List<T>();
  128. foreach (DataRow row in dt.Rows)
  129. {
  130. var t = new T();
  131. foreach (PropertyInfo p in propertyInfos)
  132. {
  133. if (dt.Columns.IndexOf(p.Name) != -1 && row[p.Name] != DBNull.Value)
  134. p.SetValue(t, row[p.Name], null);
  135. }
  136. list.Add(t);
  137. }
  138. return list;
  139. }
  140. /// <summary>
  141. /// 执行SQL返回受影响的行数
  142. /// </summary>
  143. public static int ExecuteSqlNoQuery(this DatabaseFacade facade, string sql, DbParameter[] sqlParams = null)
  144. {
  145. return ExecuteNoQuery(facade, sql, sqlParams);
  146. }
  147. ///// <summary>
  148. ///// 执行存储过程返回IEnumerable数据集
  149. ///// </summary>
  150. //public static IEnumerable<T> ExecuteStoredProcedure<T>(this IDbContextCore context, string sql, DbParameter[] sqlParams = null) where T : new()
  151. //{
  152. // return Execute<T>(context, sql, CommandType.StoredProcedure, sqlParams);
  153. //}
  154. ///// <summary>
  155. ///// 执行sql返回IEnumerable数据集
  156. ///// </summary>
  157. //public static IEnumerable<T> ExecuteSqlReader<T>(this IDbContextCore context, string sql, DbParameter[] sqlParams = null) where T : new()
  158. //{
  159. // return Execute<T>(context, sql, CommandType.Text, sqlParams);
  160. //}
  161. private static int ExecuteNoQuery(this DatabaseFacade facade, string sql, DbParameter[] sqlParams)
  162. {
  163. var db = facade;
  164. var connection = db.GetDbConnection();
  165. var cmd = connection.CreateCommand();
  166. if (connection.State == ConnectionState.Closed)
  167. connection.Open();
  168. cmd.CommandText = sql;
  169. cmd.CommandType = CommandType.Text;
  170. if (sqlParams != null)
  171. {
  172. cmd.Parameters.AddRange(sqlParams);
  173. }
  174. var result = cmd.ExecuteNonQuery();
  175. connection.Close();
  176. return result;
  177. }
  178. /// <summary>
  179. /// 带分页,执行不带参数的sql语句,返回list
  180. /// </summary>
  181. /// <typeparam name="T"></typeparam>
  182. /// <param name="strsql"></param>
  183. /// <param name="pageSize"></param>
  184. /// <param name="pageIndex"></param>
  185. /// <returns></returns>
  186. public static IEnumerable<T> GetList<T>(this DatabaseFacade facade, string strsql, DbParameter[] sqlParams, int pageSize, int pageIndex) where T : class, new()
  187. {
  188. var query = SqlQuery<T>(facade, strsql, sqlParams)
  189. .Skip((pageIndex - 1) * pageSize)
  190. .Take(pageSize)
  191. .Select(u => u).DefaultIfEmpty().ToList();
  192. return query;
  193. }
  194. public static IEnumerable<T> GetList<T>(this DatabaseFacade facade, string strsql, DbParameter[] sqlParams) where T : class, new()
  195. {
  196. var query = SqlQuery<T>(facade, strsql, sqlParams)
  197. .Select(u => u).DefaultIfEmpty().ToList();
  198. return query;
  199. }
  200. /// <summary>
  201. /// 集合为null时返回null(排除集合中第一个数据为null)
  202. /// </summary>
  203. /// <typeparam name="T"></typeparam>
  204. /// <param name="facade"></param>
  205. /// <param name="strsql"></param>
  206. /// <param name="sqlParams"></param>
  207. /// <returns></returns>
  208. public static IEnumerable<T> GetLists<T>(this DatabaseFacade facade, string strsql, DbParameter[] sqlParams) where T : class, new()
  209. {
  210. List<T> list = SqlQuery<T>(facade, strsql, sqlParams);
  211. if (list.Count > 0)
  212. {
  213. var query = list.Select(u => u).DefaultIfEmpty().ToList();
  214. return query;
  215. }
  216. else
  217. {
  218. return null;
  219. }
  220. }
  221. public static IEnumerable<T> GetList2<T>(this DatabaseFacade facade, string strsql, DbParameter[] sqlParams) where T : class, new()
  222. {
  223. var query = SqlQuery2<T>(facade, strsql, sqlParams)
  224. .Select(u => u).DefaultIfEmpty().ToList();
  225. return query;
  226. }
  227. //private static IEnumerable<T> Execute<T>(this DatabaseFacade facade, string sql, CommandType type, params DbParameter[] sqlParams) where T : new()
  228. //{
  229. // var db = facade;
  230. // var connection = db.GetDbConnection();
  231. // var cmd = connection.CreateCommand();
  232. // if (connection.State == ConnectionState.Closed)
  233. // connection.Open();
  234. // cmd.CommandText = sql;
  235. // cmd.CommandType = type;
  236. // if (sqlParams != null)
  237. // {
  238. // cmd.Parameters.AddRange(sqlParams);
  239. // }
  240. // var reader = cmd.ExecuteReader();
  241. // var dt = new DataTable();
  242. // dt.Load(reader);
  243. // reader.Close();
  244. // connection.Close();
  245. // return dt;
  246. //}
  247. //public static void ClearDatabase(this IDbContextCore context)
  248. //{
  249. // context.ClearDataTables();
  250. //}
  251. //public static void ClearDataTables(this IDbContextCore context, params string[] tables)
  252. //{
  253. // if (tables == null)
  254. // {
  255. // var tableList = new List<string>();
  256. // var types = context.GetAllEntityTypes();
  257. // if (types.Any())
  258. // {
  259. // foreach (var type in types)
  260. // {
  261. // var tableName = type.ClrType.GetCustomAttribute<TableAttribute>()?.Name;
  262. // if (tableName.IsNullOrWhiteSpace())
  263. // tableName = type.ClrType.Name;
  264. // tableList.Add(tableName);
  265. // }
  266. // }
  267. // else
  268. // {
  269. // tableList.AddRange(context.GetCurrentDatabaseTableList().Select(m => m.TableName));
  270. // }
  271. // tables = tableList.ToArray();
  272. // }
  273. // var sql = new StringBuilder();
  274. // foreach (var table in tables)
  275. // {
  276. // sql.AppendLine($"delete from {table};");
  277. // }
  278. // context.ExecuteSqlWithNonQuery(sql.ToString());
  279. //}
  280. //public static object ExecuteScalar(this IDbContextCore context, string sql, params DbParameter[] sqlParams)
  281. //{
  282. // var db = context.GetDatabase();
  283. // var connection = db.GetDbConnection();
  284. // var cmd = connection.CreateCommand();
  285. // if (connection.State == ConnectionState.Closed)
  286. // connection.Open();
  287. // cmd.CommandText = sql;
  288. // cmd.CommandType = CommandType.Text;
  289. // if (sqlParams != null)
  290. // {
  291. // cmd.Parameters.AddRange(sqlParams);
  292. // }
  293. // var result = cmd.ExecuteScalar();
  294. // connection.Close();
  295. // return result;
  296. //}
  297. }
  298. }