Extension Methods For Entity Framework Core to Execute Stored Procedure For Multiple Table

Code Snippets 4 U

public static class SprocRepositoryExtensions
{
	public static DbCommand LoadStoredProcedure(this yourDbContextClass context, string Sp_NotificationCounter)
	{
		var cmd = context.Database.GetDbConnection().CreateCommand(0;
		cmd.CommandText  = Sp_NotificationCounter;
		cmd.CommandType = System.Data.CommandType.StoredProcedure;
		return cmd;
	}
	
	public static DbCommand WithSqlParams(this DbCommand cmd, params (string, object)[] nameValues)
	{
		foreach (var pair in nameValues)
		{
			var param = cmd.CreateParameter();
			param.ParameterName = pair.Item1;
			param.Value = pair.Item2 ?? DBNull.Value;
			cmd.Parameters.Add(param);
		}
		
		return cmd;
	}
	
	public static IList<T> ExecuteStoredProcedure<T>(this DbCommand command) where T : class
	{
		using (command)
		{
			if(command.Connection.State == System.Data.ConnectionState.Closed)
				command.Connection.Open();
			try
			{
				using (var reader = command.ExecuteReader())
				{
					return reader.MapToList<T>();
				}
			}
			finally
			{
				command.Connection.Close();
			}
		}
	}
	
	public static async Task<IList<T>> ExecuteStoredProcedureAsync<T>(this DbCommand command) where T : class
	{
		using (command)
		{
			if(command.Connection.State == System.Data.ConnectionState.Closed)
				await command.Connection.OpenAsync();
			try
			{
				using (var reader = command.ExecuteReader())
				{
					return reader.MapToList<T>();
				}
			}
			finally
			{
				command.Connection.Close();
			}
		}
	}
	
	private static IList<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)
				{
					var val = dr.GetValue(colMapping[prop.Name.ToLower()].ColumnOrdinal.Value);
					prop.SetValue(obj, val == DBNull.Value ? null : val);
				}
				objList.Add(obj);
			}
		}
		return objList;
	}
}

Leave a Reply

Your email address will not be published. Required fields are marked *

twenty five + = twenty nine