Sì, ci sono altri modi (alcuni in realtà), ma consiglio vivamente di non usarne nessuno. L'opzione migliore per gestire questo caso è creare un nuovo tipo personalizzato che trattiene i dati che hai. Sarà di gran lunga l'opzione più gestibile.
I tipi anonimi sono stati progettati specificamente per essere utilizzati nell'ambito di un singolo metodo. Stai combattendo il design della funzionalità per fare altrimenti, e quindi sarà difficile da fare, molto probabilmente perderai Intellisense, molto probabilmente le prestazioni ne risentiranno, e il povero fiacco che deve tornare e mantenere il codice sarà non ho idea di cosa sta succedendo o come regolare la query.
Il problema principale con la maggior parte delle soluzioni alternative è che si perde il controllo del tempo di compilazione. Se la query rimuove un parametro, aggiunge un parametro, cambia un tipo, ecc. Il codice che lo usa non ha modo di sapere. Quando scrivi il codice per usare una query non hai modo di sapere quali sono tutte le parti di dati, quali sono i loro tipi, quali sono i nomi delle variabili, ecc. Devi preoccuparti di errori di battitura nei nomi delle variabili che il compilatore può 't prendere, e avrete costantemente bisogno di guardare il funzionamento interno del metodo che genera la query. Si perde la capacità di trattarlo come una scatola nera o astrazione, che è significativo.
Se siete preoccupati per il tempo e gli sforzi necessari per creare questi tipi personalizzati, esistono un certo numero di strumenti automatici progettati per generare tali classi basate su tabelle di database o altre fonti.
+1, non vedo alcun motivo per _non_ creare un tipo personalizzato. –