Speeding things up is never a "do this" solution - it's an iterative process that needs a fair amount of "feel".
The first thing to do is to time exactly what is happening, so you get a feel for how fast or slow the various parts are, and how much difference each change you make actually does.
So: look at the Stopwatch class
Stopwatch sw1 = new Stopwatch();
sw1.Start();
... do code to time
sw1.Stop();
Console.WriteLine("Stopwatch1: {0,06}", sw1.ElapsedMilliseconds);
This gives you a base to work from.
Run that half a dozen times so you have a small range of values to compare later.
Then, start by only returning the data from SQL that you actually need:
SELECT MyColumn FROM InvoiceDetails
Is a lot more efficient than
SELECT * FROM InvoiceDetails
Because it only returns the data you actually need. In one case you are returning at least ten columns that you don't want or use!
Time that again several times, and show me the results in both cases.