2013-04-08 10 views
7

私はSOとother sitesvarious questions見てきましたが、このしかしそれだけで働いていない、LINQでJOINを実行するための正しい構文であることをを表示されます。この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()); 

は、今のところ、事実を無視私は実際にを選択してを選択しますが、TPM_TASKの各行のst.NAMEプロパティにアクセスしたいと思います。 2つのテーブルはSTAGEIDによってリンクされています。 LINQは、結合式で

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

、両方sttaskが赤squiggliesを持っている:私は、コンパイラエラーを取得します。私が何かダムをやっていると教えてください。

+1

エラーメッセージの正確な指示に従ってみましたか? ( "等しい"のどちらかの側で式を交換することを検討してください) –

+0

@JonSkeet - 実際には私が試した*最初のものでしたが、私の表現は 'task.STAGEID == st.STAGEID'でした。これにより、同様のコンパイラエラーが発生します(式を入れ替えることを提案します)。だから私はやったし、違いを生むかもしれない「平等」な思考に切り替えた。私は 'task.STAGEID equals st.STAGEID'を試しませんでした。これは有効な組み合わせです!一口。 –

+0

あなたが 'task.STAGEID == st.STAGEID'を持っていたとき、同じエラーメッセージを受け取ることはありませんでした。なぜならあなたの参加はその時点で完全に無効だったからです。 –

答えて

11

外部シーケンスからのキーセレクタを先に実行する必要があります。あなたのケースの外のシーケンスはpv.TPM_TASKです。だから、あなたに参加する必要があります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コンパイラ。本当にありがとう! –

+0

@MikeChristensen:それは本当に厄介なことではありません。 「平等」の2つの側面は完全に異なるスコープを持っています。左側は「st」を知らず、右側は「task」を知らない。このようなことについては、クエリ式の構文が実際に意味するものについて考えることは有益です。詳細については、http://msmvps.com/blogs/jon_skeet/archive/2011/01/28/reimplementing-linq-to-objects-part-41-how-query-expressions-work.aspxを参照してください。 –

+0

@JonSkeet - 情報ありがとう!私はちょっとLINQの初心者で、ジョインのようなもっと複雑なものについては簡単に投げ捨てられます。私は、オペランドの順序が重要ではないSQL JOINに似た働きをしていると考えました。 –

関連する問題