As far as I understand, the \"correct\" way to use a TransactionScope is to always call transactionScope.Complete(); before exiting the using
So my question is, must it be used or not?
Complete must be used when updates are made in order to COMMIT the transaction. Otherwise, the transaction manger will issue a ROLLBACK and undo changes made.
With a read-only transaction like your example, I can think of no material difference with or without Complete. The COMMIT or ROLLBACK issued by the transaction manager will have the same net effect of releasing locks and resources held by the transaction in both cases.
Although it's not a requirement to invoke Complete in a read-only transaction, it's still a best practice IMHO. Consider the poor developer who later unwittingly adds data modification code to your transaction block without seeing Complete is missing.