SqlCommand ExecuteReaderAsync helper method The following helper method executes commands asynchronously and returns a Task&lt;IEnumerable&lt;T&gt;&gt; where T is a type that receives the row information from the SqlDataReader rows. All works fine.

    public static async Task&lt;IEnumerable&lt;T&gt;&gt; CommandExecuteReaderAsync&lt;T&gt;(SqlConnection conn, SqlTransaction trans, CommandType commandType, string commandText, IEnumerable&lt;SqlParameter&gt; parameters, CancellationToken token, int commandTimout)
    {
        using (var command = new SqlCommand(commandText, conn, trans))
        {
            command.CommandTimeout = commandTimout;
            command.Parameters.AddRange(parameters.ToArray());
            command.CommandType = commandType;
            using (var sr = await command.ExecuteReaderAsync(token))
            {
                var dc = new System.Data.Linq.DataContext(conn);

                return dc.Translate&lt;T&gt;(sr).ToList();
            }
        }
    }


However, I'm not happy with my current approach of creating a new DataContext and using it's Translate&lt;T&gt; method. 

Is there a better approach as the creation of the DataContext seems a bit excessive?
DataContext


  [..]the creation of the DataContext seems a bit excessive


Why do you think so? Is creating the SqlCommand not excessive? You are instantiating it the same number of times.

If DataContext.Translate helps you to save time by not writing the mapping your self then I'd say it's fine. Just remember that DataContext is a disposable type too, so you should add one more using for it.



Naming

Apart from the DataContext you should try to make you code more consistent. This means, don't use abbreviations like conn or trans. Use full words especially for parameters.



Style


public static async Task&lt;IEnumerable&lt;T&gt;&gt; CommandExecuteReaderAsync&lt;T&gt;(
  SqlConnection conn, 
  SqlTransaction trans, 
  CommandType commandType, 
  string commandText, 
  IEnumerable&lt;SqlParameter&gt; parameters, 
  CancellationToken token, 
  int commandTimout)



I hope you have some overloads for this method. 7 (!) parameters, this is a lot. You should try to reduce them and in fact you can hide at least three.

If you make it an extension for the SqlConnection then you'll have one parameter less that you have to specify. 

If you use TransactionScope then you can get rid of the second parameter, the SqlTransaction.

If you write two more helper methods (ExecuteQueryAsync &amp; ExecuteStoredProcedureAsync) that call this method, then you can get rid of the CommandType parameter. 

So no you just have four parameters left that you must specify: commandText, cancelltionToken &amp; commandTimeout &amp; parameters.