aniket narvankar
aniket narvankar

Reputation: 15

C# : IF ELSE replacement

In the application there are 3 methods,in the methods there are update/insert queries. Methods are dependent on each other. If first method runs successfully, second is called; second runs successfully - third is called.

Here is code I have written

DataContext Class

using System;
using System.Collections.Generic;
using System.Text;
using Dapper;
using System.Data.SqlClient;
using System.Data;

namespace DataAccessEntity.DbContext
{
    public class DataContext
    {
        static SqlConnection con;
        static SqlTransaction tran;
        
        public static SqlTransaction StartTransaction()
        {
            return con.BeginTransaction();
        }
        public static void RollBackTransaction()
        {
            tran.Rollback();
        }
        public static void CommitTransaction()
        {
            tran.Commit();
        }
        public static int ExecuteSql(string sql,string connectionstring,DynamicParameters param)
        {
            int result = 0;
            try
            {
                using (con = new SqlConnection(connectionstring))
                {
                    if (con.State.Equals(ConnectionState.Closed))
                        con.Open();
                            tran = StartTransaction();
                            result = 
                           con.Execute(sql,null,tran,0,CommandType.Text);
                            CommitTransaction();
                        con.Close();
                }
            }
            catch (Exception ex)
            {
                RollBackTransaction();
                throw ex;
            }
            finally
            {
                con.Close();
            }
            
            return result;
        }
        public static DataTable ExecuteToDataTable(string sql, string connectionstring, DynamicParameters param, SqlTransaction tran)
        {
            DataTable dt = null;
            using (con = new SqlConnection(connectionstring))
            {
                if (con.State.Equals(ConnectionState.Closed))
                    con.Open();
                var result = con.ExecuteReader(sql, null, null, 0, CommandType.Text);
                dt = new DataTable();
                dt.Load(result);
                con.Close();
            }
            return dt;
        }
    }
}

DataAccessEntity

using System;
using System.Data.SqlClient;
using System.Data;
using Microsoft.Extensions.Configuration;
using DataAccessEntity.DbContext;

namespace DataAccessEntity
{
    public class CountryDE
    {
        static string connectionstring;
        public static int UpdateCountry(IConfiguration _iconfiguration)
        {
            try
            {
                connectionstring = _iconfiguration.GetConnectionString("Default");
                string sql = "Update tb_country set country='Spain' where id=1;Update tb_country set country='USA' where id=2;Update tb_country set country='USA' where id=13;Update tb_country set country='USA' where id=14;Update tb_country set country='USA' where id=15;Update tb_country set country='USA' where id=16";
                int result = DataContext.ExecuteSql(sql, connectionstring, null);
                return result;
            }
            catch(Exception ex)
            {
                throw ex;
            }
        }

        public static int AddCountries(IConfiguration _iconfiguration)
        {
            try
            {
                connectionstring = _iconfiguration.GetConnectionString("Default");
                string sql = "insert into tb_country(country,active) values ('Argentina',1)";
                int result = DataContext.ExecuteSql(sql, connectionstring, null);
                return result;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public static DataTable GetCountry(IConfiguration _iconfiguration)
        {
            try
            {
                connectionstring = _iconfiguration.GetConnectionString("Default");
                string sql = "Select id,country,active from tb_country";
                DataTable dt = DataContext.ExecuteToDataTable(sql, connectionstring, null, null);
                return dt;
            }
            catch(Exception ex)
            {
                throw ex;
            }
}
    }
}

BusinessEntity

using System;
using DataAccessEntity;
using Microsoft.Extensions.Configuration;
using UtilityEntity;
using System.Data;
using System.Reflection;

namespace BusinessEntity
{
    public class CountryBE
    {
        public static int UpdateCountry(IConfiguration _iconfiguration)
        {
            int result = 0;
            try
            {
                Logger.LogMessage(MethodBase.GetCurrentMethod().Name + "" + "Started");
                result = CountryDE.UpdateCountry(_iconfiguration);
            }
            catch (Exception ex)
            {
                Logger.LogException(ex.Message);
            }
            return result;
        }

        public static int AddCountries(IConfiguration _iconfiguration)
        {
            int result = 0;
            try
            {
                Logger.LogMessage(MethodBase.GetCurrentMethod().Name + "" + "Started");
                result = CountryDE.AddCountries(_iconfiguration);
            }
            catch (Exception ex)
            {
                Logger.LogException(ex.Message);
            }
            return result;
        }

        public static DataTable GetCountry(IConfiguration _iconfiguration)
        {
            try
            {
                Logger.LogMessage(MethodBase.GetCurrentMethod().Name + "" + "Started");
                DataTable dt = CountryDE.GetCountry(_iconfiguration);
                return dt;
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }
    }
}

Main Program.cs

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using System;
using System.IO;
using DataModelEntity;
using UtilityEntity;
using BusinessEntity;
using System.Data;
using Microsoft.Extensions.DependencyInjection;
using NLog.Extensions.Logging;

namespace ConsoleApp1
{
    class Program
    {
        private static IConfiguration _iconfiguration;
        static void Main(string[] args)
        {
            GetAppSettingsFile();
            var servicesProvider = BuildDi(_iconfiguration);

            using(servicesProvider as IDisposable)
            {
                servicesProvider.GetRequiredService<Logger>();
            }
            UpdateCountries();
            
        }

        public static IServiceProvider BuildDi(IConfiguration config)
        {
            return new ServiceCollection()
                .AddTransient<Logger>().
                AddLogging(loggingBuilder =>
                {
                    loggingBuilder.ClearProviders();
                    loggingBuilder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Information);
                    loggingBuilder.AddNLog(config);
                }).BuildServiceProvider();
        }
        static void GetAppSettingsFile()
        {
            var builder = new ConfigurationBuilder()
                                 .SetBasePath(Directory.GetCurrentDirectory())
                                 .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
            _iconfiguration = builder.Build();
        }

        

        static void UpdateCountries()
        {
            int result = CountryBE.UpdateCountry(_iconfiguration);
             
            if(result > 0)
            {
                AddCountries();
            }
            else
            {
                Console.WriteLine("Not Updated");
            }
        }

        static void AddCountries()
        {
            int result = CountryBE.AddCountries(_iconfiguration);
             
            if(result > 0)
            {
                GetCountryDetails();
            }
            else
            {
                Console.WriteLine("Not Updated");
            }
        }

        static void GetCountryDetails()
        {
            Console.WriteLine("Get Countries");
            DataTable dt = CountryBE.GetCountry(_iconfiguration);
            foreach(DataRow dr in dt.Rows)
            {
                Console.WriteLine(dr["country"].ToString());
            }
            Console.WriteLine("Press any key to stop.");
            Console.ReadKey();
        }
    }
}

As in Program.cs if else is used, I want to write this same code without using if statement, switch case or ternary operators. please guide me on how to do this.

Upvotes: 0

Views: 1401

Answers (3)

David Oganov
David Oganov

Reputation: 1364

To give you another idea how things can be done, I'd suggest you looking into Functional Programming You can find similar approach in my Answer to a similar problem. Basically what you can do is introduce a method for the if statement and reuse the method where needed. That way you will not have if statements as you wanted and will have the logic written in one single place. For example you can have a method like this:

 private static bool ExecuteIfTrue(this bool nonQueryResult, Func<int> nonQueryAction, Action actionToInvoke)
 {
     if (nonQueryResult && nonQueryAction() > 0)
     {
         actionToInvoke();
         return true;
     }

     return false;
 }

And then chain your methods w/o if statements in a functional programming style:

var initialResult = ExecuteNonQuery() > 0;
initialResult.ExecuteIfTrue(ExecuteNonQuery, Method1)
   .ExecuteIfTrue(ExecuteNonQuery, Method2)
   .ExecuteIfTrue(ExecuteNonQuery, Method3)
// ......
   ;

Upvotes: 0

Tarik
Tarik

Reputation: 11209

I would first change the method signatures to return result.

You can then declare and array methods of Func<int> and initialize it to Method1, Method2, ...Methodn

You then just need a loop:

foreach (method in methods) {
    if (method() == 0)
        break; // or any other action.
}

Code can be added to handle something going wrong.

Upvotes: 2

Rodrigo Rodrigues
Rodrigo Rodrigues

Reputation: 8556

@Tarik's answer is simple and does the job, I'd go with that.

There are other ways though.
You could, for example, create a Task for each method, and use one of the multiple options that c# TPL provides for that (for example, continuations)

Another simple thing, would be to make use of the short-circuit conditional operators, like this:

return cmd.ExecuteNonQuery1() > 0
    && cmd.ExecuteNonQuery2() > 0
    && cmd.ExecuteNonQuery3() > 0
    && cmd.ExecuteNonQuery4() > 0;

Upvotes: 2

Related Questions