DbContext-扩展方法-支持存储过程

一、方法封装

  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;
      }
    }


  }
原文地址:https://www.cnblogs.com/ABC-wangyuhan/p/14679641.html