一、方法封装
public static class DbContextExtension { public static List<T> GetList<T>(this DbContext db, string sql, CommandType type=CommandType.Text, params DbParameter[] parameters) { try { using (DbConnection conn = db.Database.Connection) { if (conn.State == ConnectionState.Closed) { conn.Open(); } using (DbCommand cmd = conn.CreateCommand()) { cmd.CommandText = sql; cmd.CommandType = type; cmd.Parameters.AddRange(parameters); DataTable dt = new DataTable(); using (DbDataReader reader = cmd.ExecuteReader()) { dt.Load(reader); } cmd.Parameters.Clear(); string json = dt.ToJson(); List<T> list = json.ToObject<List<T>>(); return list; } } } catch (Exception ex) { throw new Exception(ex.Message); } } }
二、方法调用
int code = 0; SqlParameter[] param = { new SqlParameter("@year",year), new SqlParameter("@userId",userId), new SqlParameter("@code ",code){ Direction=ParameterDirection.Output} }; List<EChartsDto<int>> data = new List<EChartsDto<int>>(); data = db.GetList<EChartsDto<int>>("[dbo].[proc_getRecordsByUser]", CommandType.StoredProcedure, param);
三、其他版本
public static class DbContextExtensions { public static IEnumerable<TElement> ExecuteProc<TElement>(this DbContext db, string sql, params object[] parameters) where TElement : new() { var connection = db.Database.GetDbConnection(); using (var cmd = connection.CreateCommand()) { db.Database.OpenConnection(); cmd.CommandText = sql; cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.Parameters.AddRange(parameters); var dr = cmd.ExecuteReader(); var columnSchema = dr.GetColumnSchema(); var data = new List<TElement>(); while (dr.Read()) { TElement item = new TElement(); Type type = item.GetType(); foreach (var kv in columnSchema) { var propertyInfo = type.GetProperty(kv.ColumnName); if (kv.ColumnOrdinal.HasValue && propertyInfo != null) { var value = dr.IsDBNull(kv.ColumnOrdinal.Value) ? null : dr.GetValue(kv.ColumnOrdinal.Value); if (value != null && propertyInfo.PropertyType != typeof(int) && propertyInfo.PropertyType != typeof(double)) { value = value.ToString(); } propertyInfo.SetValue(item, value); } } data.Add(item); } dr.Dispose(); return data; } } public static DataTable ExecuteProc(this DbContext db, string sql, params object[] parameters) { DataTable dt = new DataTable(); var connection = db.Database.GetDbConnection(); using (var cmd = connection.CreateCommand()) { db.Database.OpenConnection(); cmd.CommandText = sql; cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.Parameters.AddRange(parameters); SqlDataAdapter sda = new SqlDataAdapter((SqlCommand)cmd); sda.Fill(dt); return dt; } } }