DAL Returns a collection of business objects in MVP In Model View Presenter (MVP) pattern, it is said that our DAL always should returns business models. 


If I want to get a list of business objects from my DAL, is it acceptable to do it as follows or better to get a DataTable from DAL and then in the applications BLL, converts it to a List?

public List&lt;Employee&gt;  GetNewEmployees()
{
    string selectStatement = "SELECT Employee.Emp_ID, Employee.Initials + ' ' + Employee.Surname AS Name,...";

    using (SqlConnection sqlConnection = new SqlConnection(db.GetConnectionString))
    {
        using (SqlCommand sqlCommand = new SqlCommand(selectStatement, sqlConnection))
        {
            sqlConnection.Open();
            using (SqlDataReader dataReader = sqlCommand.ExecuteReader())
            {
                List&lt;Employee&gt; list = new List&lt;Employee&gt;();
                while (dataReader.Read())
                {
                    list.Add (
                    new EpfEtfMaster { 
                        EmployeeID = (int) dataReader ["emp_id"],
                        EmployeeName = (string) dataReader ["Name"],
                        AppointmentDate = (DateTime) dataReader["appointment_date"],                                   
                    });                            
                }
                return list;
            }
        }
    }
}
You don't want to pull the entire Employee table unless necessary.

public IEnumerable&lt;Employee&gt;  GetNewEmployees()
{
    string selectStatement = "SELECT Employee.Emp_ID, Employee.Initials + ' ' + Employee.Surname AS Name,...";

    using (SqlConnection sqlConnection = new SqlConnection(db.GetConnectionString))
    {
        using (SqlCommand sqlCommand = new SqlCommand(selectStatement, sqlConnection))
        {
            sqlConnection.Open();
            using (SqlDataReader dataReader = sqlCommand.ExecuteReader())
            {
                while (dataReader.Read())
                {
                    yield return new EpfEtfMaster(){ 
                        EmployeeID = (int) dataReader ["emp_id"],
                        EmployeeName = (string) dataReader ["Name"],
                        AppointmentDate = (DateTime) dataReader["appointment_date"],                                   
                    };
                }
            }
        }
    }
}


By switching to IEnumerable and yield return, when you call GetNewEmployees().First(), only the first row is read.




The names like sqlCommand, sqlConnection and dataReader can be shortened to command, connection and reader without affecting the reader.
Try to not repeat yourself with SomeThing someThing = new SomeThing(...);. The first class name can be replaced by using var. 


Result : 

using (var connection = new SqlConnection(db.GetConnectionString))




new SqlConnection(db.GetConnectionString)


Use verb for method and noun for field/properties. Here GetX suggest it is a method but is used like a property, you can rename it to ConnectionString.