Can this performance be improved?
the query plan shows a timeout during the optimisation process and is typical of this type of code. As long as this is generated from .Net in this fashion you are going to have to endure the resulting performance penalties. Ultimately you need to give the optimiser a chance to come up with good plans in a stepped fashion. In other words you need to break this up into smaller chunks of work for the optimiser and at the end you combine those sets to create your result.