Build an entity, based on a defined model by comparing table column to entity names and building Can I optimize the BuildEntity method more?          

protected IEnumerable&lt;GroupTitle&gt; BuildProductGroup()
    {
        var productGroups = new List&lt;GroupTitle&gt;();
        using (var connection = new SqlConnection(_dbConnection))
        using (var command = new SqlCommand(_getProductGroups, connection))
        {
            connection.Open();
            command.CommandType = CommandType.StoredProcedure;
            using (var reader = command.ExecuteReader())
                while(reader.Read())
                {
                    var productGroup = new GroupTitle();
                    BuildEntity&lt;GroupTitle&gt;(reader, ref productGroup);
                    productGroups.Add(productGroup);
                }
        }

        return productGroups;
    }

    protected TEntity BuildEntity&lt;TEntity&gt;(IDataReader reader, TEntity model)
    {
        var type = model.GetType();
        var table = Enumerable.Range(0, reader.FieldCount).Select(reader.GetName).ToArray();

        foreach (var column in table)
        {
            var matchColumnToProperty = type.GetProperties().FirstOrDefault(property =&gt; String.Compare(property.Name, column, true) == 0);
            if (matchColumnToProperty != null &amp;&amp; !reader.IsDBNull(reader.GetOrdinal(matchColumnToProperty.Name)))
                matchColumnToProperty.SetValue(model, reader.GetValue(reader.GetOrdinal(matchColumnToProperty.Name)), null);
        }

        return model;
    }
You can cache the properties to improve performance. No need to retrieve them repeatedly within the body of that for loop.

Also, simplify the LINQ expression to gather all the matching properties, and then iterate over the result set in one fell swoop.

protected IEnumerable&lt;GroupTitle&gt; BuildProductGroup()
{
    var productGroups = new List&lt;GroupTitle&gt;();
    using (var connection = new SqlConnection(_dbConnection))
    using (var command = new SqlCommand(_getProductGroups, connection))
    {
        connection.Open();
        command.CommandType = CommandType.StoredProcedure;
        using (var reader = command.ExecuteReader())
        {
            while(reader.Read())
            {
                var productGroup = new GroupTitle();
                BuildEntity&lt;GroupTitle&gt;(reader, ref productGroup);
                productGroups.Add(productGroup);
            }
        }
    }

    return productGroups;
}

protected TEntity BuildEntity&lt;TEntity&gt;(IDataReader reader, TEntity model)
{
    var type = model.GetType();
    var table = Enumerable.Range(0, reader.FieldCount).Select(reader.GetName).ToArray();

    var properties = type.GetProperties();
    var matchedColumns = properties.Where(property =&gt; string.Compare(property.Name, 
                                                                     column, 
                                                                     true) == 0 
                                                      &amp;&amp; !reader.IsDBNull(reader.GetOrdinal(matchColumnToProperty.Name)));

    foreach (var property in matchedColumns)
    {
        var value = reader.GetValue(reader.GetOrdinal(matchColumnToProperty.Name));
        matchColumnToProperty.SetValue(model, value, null);
    }

    return model;
}