2013-04-08 12 views
7

Ho guardato various questions su SO e other sites, e questo sembra essere la sintassi corretta per eseguire un JOIN in LINQ, ma è solo non funziona:C'è qualche errore di sintassi con questo LINQ JOIN?

var stages = (from stage in entityManager.TPM_TASKSTAGE select stage); 
var results = (from task in pv.TPM_TASK 
       join st in stages on st.STAGEID equals task.STAGEID 
       where task.TASKTYPE == "Solution" 
       select new SolutionTask()); 

Ignora, per ora, il fatto che in realtà non sono selezionare nulla di interesse, ma mi piacerebbe avere accesso alla proprietà st.NAME su ogni riga di TPM_TASK. Le due tabelle sono collegate da STAGEID. Ottengo l'errore del compilatore:

The name 'st' is not in scope on the left side of 'equals'. Consider swapping the expressions on either side of 'equals'.

Nell'espressione LINQ unirsi, sia st e task hanno squigglies rosse. Per favore dimmi che sto facendo qualcosa di stupido.

+1

Hai provato a seguire le istruzioni esatte nel messaggio di errore? ("Considera di scambiare le espressioni su entrambi i lati di" equals "") –

+0

@JonSkeet - In realtà era la * prima * cosa che ho provato, tuttavia la mia espressione era 'task.STAGEID == st.STAGEID'. Questo produce un errore simile nel compilatore (suggerendo di scambiare le espressioni). Così ho fatto, e anche passato a pensare "equals" che potrebbe fare la differenza. Non ho provato 'task.STAGEID equivale a st.STAGEID' che è la combinazione valida! Sospiro. –

+0

Quando avevi 'task.STAGEID == st.STAGEID' non avresti avuto lo stesso messaggio di errore, perché il tuo join sarebbe stato * completamente * non valido a quel punto. –

risposta

11

Il selettore a chiave dalla sequenza esterna deve essere il primo. La sequenza esterna nel tuo caso è pv.TPM_TASK. Quindi, dovresti iscriverti allo task.STAGEID equals st.STAGEID

var stages = (from stage in entityManager.TPM_TASKSTAGE select stage); 
var results = (from task in pv.TPM_TASK 
       join st in stages on task.STAGEID equals st.STAGEID // here 
       where task.TASKTYPE == "Solution" 
       select new SolutionTask()); 
+1

Compilatore schizzinoso. Grazie mille! –

+0

@MikeChristensen: Non è davvero una questione di essere schizzinosi. I due lati di 'equals' hanno scopi completamente diversi: il lato sinistro non ha conoscenza di' st', e il lato destro non ha conoscenza di 'task'. Per questo tipo di cose, è utile pensare a cosa significhi realmente la sintassi di espressione di query. Vedi http://msmvps.com/blogs/jon_skeet/archive/2011/01/28/reimplementing-linq-to-objects-part-41-how-query-expressions-work.aspx per maggiori dettagli. –

+0

@JonSkeet - Grazie per le informazioni! Sono un principiante di LINQ, e mi butto via facilmente quando si tratta di cose più complicate come i join. Ho pensato che funzionassero in modo simile a un SQL JOIN, in cui l'ordine degli operandi non ha importanza. –

Problemi correlati