Entity Framework Core extension to Execute Stored procedure and get results back
Since Entity Framework Core is fairly new (at the time I am writing) and still under development. Not most of the required features are not there out of the box and you will have to write extensions. I have to utilise an existing stored procedure to get some data from database. I have to use ADO for this, Create a file name DatabaseContextExtensions.cs and paste below code.
public static class DatabaseContextExtensions { public static List<T> CollectionFromSql<T>(this DbContext dbContext, string sql, Dictionary<string, object> parameters) where T : class, new() { using (var cmd = dbContext.Database.GetDbConnection().CreateCommand()) { cmd.CommandText = sql; if (cmd.Connection.State != ConnectionState.Open) cmd.Connection.Open(); foreach (KeyValuePair<string, object> param in parameters) { DbParameter dbParameter = cmd.CreateParameter(); dbParameter.ParameterName = param.Key; dbParameter.Value = param.Value; cmd.Parameters.Add(dbParameter); } List<T> results = null; using (var dataReader = cmd.ExecuteReader()) { results = DataReaderMapToList<T>(dataReader); } return results; } } public static List<T> DataReaderMapToList<T>(IDataReader dr) { List<T> list = new List<T>(); T obj = default(T); while (dr.Read()) { obj = Activator.CreateInstance<T>(); foreach (PropertyInfo prop in obj.GetType().GetProperties()) { if (!object.Equals(dr[prop.Name], DBNull.Value)) { prop.SetValue(obj, dr[prop.Name], null); } } list.Add(obj); } return list; } }
And this is the usage.
public User GetUserName(string emailAddress) { var user = _context.CollectionFromSql<User>("[dbo].[GetUser] @EmailAddress", new Dictionary<string, object> { { "@EmailAddress", emailAddress } }).ToList().FirstOrDefault(); return user; }