2013-04-08 12 views
7

Ich habe bei various questions auf SO sah und other sites, und diese erscheint die korrekte Syntax, um ein JOIN in LINQ auszuführen, ist es aber einfach nicht funktioniert:Gibt es bei diesem LINQ JOIN eine Art Syntaxfehler?

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()); 

ignorieren, denn jetzt, die Tatsache, dass ich eigentlich nicht wählen Sie alles von Interesse, aber ich hätte gerne Zugriff auf die st.NAME Eigenschaft auf jeder Zeile TPM_TASK. Die zwei Tabellen sind durch STAGEID verbunden. Ich erhalte die Compiler-Fehler:

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

Im LINQ Ausdruck kommen, die beide st und task haben rote squigglies. Bitte sag mir, dass ich etwas Dummes mache.

+1

Haben Sie versucht, die genauen Anweisungen in der Fehlermeldung zu folgen? ("Ziehe es in Betracht, die Ausdrücke auf beiden Seiten von 'equals' zu vertauschen") –

+0

@JonSkeet - Das war eigentlich das * erste * was ich versuchte, aber mein Ausdruck war 'task.STAGEID == st.STAGEID'. Dies führt zu einem ähnlichen Compiler-Fehler (was darauf hindeutet, dass ich die Ausdrücke vertausche). Ich tat es und wechselte auch zu "equals", weil ich dachte, dass das einen Unterschied machen könnte. Ich habe nicht versucht "task.STAGEID ist gleich st.STAGEID" was die gültige Kombination ist! Seufzer. –

+0

Wenn Sie 'task.STAGEID == st.STAGEID 'hatten, hätten Sie nicht dieselbe Fehlermeldung erhalten, da Ihr Join an diesem Punkt * vollständig * ungültig gewesen wäre. –

Antwort

11

Schlüsselwähler von äußerer Reihenfolge sollte zuerst gehen. Äußere Reihenfolge in Ihrem Fall ist pv.TPM_TASK. So sollten Sie beitreten 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

Picky Compiler. Vielen Dank! –

+0

@MikeChristensen: Es ist wirklich keine Frage von wählerisch. Die zwei Seiten von 'equals' haben völlig unterschiedliche Bereiche: Die linke Seite hat keine Kenntnis von' st', und die rechte Seite hat keine Kenntnis von 'task'. Für diese Art von Dingen ist es nützlich, darüber nachzudenken, was die Abfrageausdrucksyntax wirklich bedeutet. Weitere Informationen finden Sie unter http://msmvps.com/blogs/jon_skeet/archive/2011/01/28/reiplementing-linq-to-objects-part-41-how-query-expressions-work.aspx. –

+0

@JonSkeet - Danke für die Info! Ich bin irgendwie ein LINQ-Neuling und werde leicht abgeworfen, wenn es um kompliziertere Dinge wie Joins geht. Ich dachte, sie arbeiteten ähnlich wie SQL-JOIN, wobei die Reihenfolge der Operanden keine Rolle spielt. –