In this Code snippet you will find a comprehensive Extension Methods for executing stored procedures. This code is taken from different posts online. And tested using different scenarios. Including api and parallel requests.
- Add the following class to your dotnet Core Project
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | using Microsoft.Data.SqlClient; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Data.Common; using System.Linq; using System.Reflection; using System.Threading.Tasks; public static class CommonExtentions { public static List<T> MapToList<T>(this DbDataReader dr) { var objList = new List<T>(); var props = typeof(T).GetRuntimeProperties(); var colMapping = dr.GetColumnSchema() .Where(x => props.Any(y => y.Name.ToLower() == x.ColumnName.ToLower())) .ToDictionary(key => key.ColumnName.ToLower()); if (dr.HasRows) { while (dr.Read()) { T obj = Activator.CreateInstance<T>(); foreach (var prop in props) { if (colMapping.ContainsKey(prop.Name.ToLower())) { var val = dr.GetValue(colMapping[prop.Name.ToLower()].ColumnOrdinal.Value); prop.SetValue(obj, val == DBNull.Value ? null : val); } } objList.Add(obj); } } return objList; } public static DbCommand LoadStoredProc( this DbContext context, string storedProcName) { var cmd = context.Database.GetDbConnection().CreateCommand(); cmd.CommandText = storedProcName; cmd.CommandType = System.Data.CommandType.StoredProcedure; return cmd; } public static DbCommand WithSqlParam( this DbCommand cmd, string paramName, object paramValue) { if (string.IsNullOrEmpty(cmd.CommandText)) throw new InvalidOperationException( "Call LoadStoredProc before using this method"); var param = cmd.CreateParameter(); param.ParameterName = paramName; param.Value = paramValue == null ? DBNull.Value : paramValue; cmd.Parameters.Add(param); return cmd; } public static int ExecuteStoredProc(this DbCommand command) { using (command) { command.CommandType = System.Data.CommandType.StoredProcedure; if (command.Connection.State == System.Data.ConnectionState.Closed) command.Connection.Open(); try { var toreturn = command.ExecuteNonQuery(); return toreturn; } catch (Exception e) { throw (e); } finally { command.Connection.Close(); } } } public static List<T> ExecuteStoredProc<T>(this DbCommand command) { using (command) { if (command.Connection.State == System.Data.ConnectionState.Closed) command.Connection.Open(); try { using (var reader = command.ExecuteReader()) { return reader.MapToList<T>(); } } catch (Exception e) { throw (e); } finally { command.Connection.Close(); } } } } |
1 2 3 4 5 6 7 8 9 | List<MyType> myTypeList = new List<MyType>(); using (var context = new MyDbContext()) { myTypeList = context.LoadStoredProc("StoredProcedureName") .WithSqlParam("firstparamname", firstParamValue) .WithSqlParam("secondparamname", secondParamValue). .ExecureStoredProc<MyType>(); } |
Post a Comment
Post a Comment