0

私は、コードが最初に書かれたシステムでVS2010とVS2012でうまく動作するlinqクエリを持っていますが、SVNにコミットし、構築されていません。同じコードは2システムで正常に動作しますが、VS2012、.NET Framework 4.0(ターゲットフレームワーク)を持つ他の3システムでは失敗します。System.Linq LinqのクエリはVS2012で動作しませんが、VS2010でうまく動作します

コードに何が問題なのかよくわかりません。私は、書かれたコードがバグを持っていることを理解しており、ひどく間違った方法で書かれています。

ここでは、VS2010では正常に動作しますが、VS2012では失敗するサンプルlinqクエリを示します。クエリd.CandidateType以上から

from d in db.VacancyCandidates 
join c in db.Candidates on new 
    { CandidateId = d.CandidateId, CandidateType = d.CandidateType} 
equals new { CandidateId = c.CandidateId, CandidateType = c.CanidateTypeId }   
........Rest query ...... 

Nullable<int>c.CanidateTypeIdがintです。

私はpostを見て、d.CandidateTyped.CandidateType.Valueに変更すると、コードが正しくビルドされます。

私の質問は、VS2010でコードがビルドされ、VS2012ではマシンが作成されない理由です。

あなたを助けるスクリーンショットを追加してください。 Errors References

詳しい情報関連コンパイラ:

enter image description here

のPls。すべてのシステムで、プロジェクトの対象フレームワークは4.0のみであることがわかります。上記の情報は、CSC /?コマンドを使用して検索されます。C:\Windows\Microsoft.NET\Framework64\V4.0.3.319\

+0

エラー/例外はありますか? – meJustAndrew

+1

コードが間違っているため、VS2010で動作するかどうかは問題ではありません(コンパイラのバグかもしれません)。 '=(int?)c.CandidateTypeId'を追加して移動してください。 –

+0

@IvanStoev私はすでにコードを変更していますが、元のシステムでVS2010とVS2012の間違ったコードが正常に動作したことを理解しようとしています。それは私にとっては興味深い質問です! –

答えて

1

VS2010でC#コンパイラの旧バージョンで動作する理由については言及できません。

現在、コンパイラは参照するメンバのTypeNameを使用して、生成する必要のある匿名型を判断します。

まったく同じシグネチャを持つ匿名型との一致を試みます。したがってnew { A = "1" }new { A = "2" }は同じタイプですが、new { A = "1" }new { A = 1 }は同じタイプではありません。

最初に生成される匿名タイプは、それぞれとCandidateTypeのタイプがintint?である可能性があります。 2番目の匿名型では、それと全く同じシグネチャを持つ他の型があるかどうかを検証します。ここでは当てはまりません。CandidateTypeは2番目の初期化子にタイプintです。

このように、シグネチャが一致するようにするには、型の整列を確保する必要があります。

from d in db.VacancyCandidates 
join c in db.Candidates on new { CandidateId = d.CandidateId, CandidateType = d.CandidateType} 
equals new { CandidateId = c.CandidateId, CandidateType = (int?)c.CanidateTypeId } 

値がnullときNullable<>型の値を消費すると、失敗することに注意してください。したがって、あなたの提案された解決策はd.CandidateType.Valueかもしれません。は危険です。 "Might"は、Linq-to-SQLまたはEntityFramework経由でデータベースに直接クエリを行っているか、メモリ内で作業しているかによって動作が異なるため、危険です。

は、メモリ・ラムダのように実行したときnullNullable<>.ValueInvalidOperationExceptionを投げますがかかりますが、QueryProviderは、この問題を解決するために十分にスマートであるように、ケースには、SQLクエリに変換されません。

+0

まさにそれが私が書いた理由です...コードはひどく間違って書かれています。私が探しているコードは誰かによって書かれており、大規模なアプリケーションです。私は非常に高いレベルで何が起きているのかについての洞察を持っていないコードを見ているので、Nullableをnull値ではない型に変更することは不確かです。この特定のエラーのための私の仕事は、コードを変更せずにすべてのシステムでコードを動作させることです。私はそれが狂ったように聞こえることを知っているが、それは私が扱っているものです。 –

+0

私はVS2012を持っている他のシステムでも同じコードがコンパイルされていて、同じバージョンのVS2012を持つシステムではなぜ失敗するのか疑いがあります。私はこれが環境の違いと関係していることを知っています。それが私が考え出しているものです。 –

+0

@HirenDesai両方の環境間でコンパイラのバージョンを比較します。これはおそらく行動の違いの原因です。 –

関連する問題