2009-06-16 4 views
1

以下の2つのクエリは機能的に同じですか? 最初のものはデータを返しませんが、2番目のものは同じ正確な入力で正常に動作します。 私の最初のクエリで何が間違っているかを指摘できますか?Linqが複数のプロパティで結合する

Dim LTest2 As IEnumerable = From e1 As QNCEntity In Shape.Entities _ 
         Join e2 As QNCEntity In Shape.Entities _ 
         On New With { _ 
            .X = CDbl(e1.EntObj.X2), _ 
            .Y = CDbl(e1.EntObj.Y2) _ 
            } _ 
         Equals New With { _ 
              .X = CDbl(e2.EntObj.X1), _ 
              .Y = CDbl(e2.EntObj.Y1) _ 
             } 

Dim LTest3 As IEnumerable = From e1 As QNCEntity In Shape.Entities _ 
           Join e2 As QNCEntity In Shape.Entities _ 
           On CDbl(e1.EntObj.X2) Equals CDbl(e2.EntObj.X1) _ 
           And CDbl(e1.EntObj.Y2) Equals CDbl(e2.EntObj.Y1) 

おかげ

答えて

1

匿名型のインスタンスをなしキーのプロパティのみ自体にEqualです。

参照:MSDN article on Anonymous Types, Header - Key Properties, Equality

が第二と同じ最初のクエリの作業を行うには、あなたがキープロパティとしてXとYプロパティをマークするために、あなたの最初のコードサンプルを変更する必要があります。

Dim LTest2 As IEnumerable = From e1 As QNCEntity In Shape.Entities _ 
         Join e2 As QNCEntity In Shape.Entities _ 
         On New With { _ 
             Key .X = CDbl(e1.EntObj.X2), _ 
             Key .Y = CDbl(e1.EntObj.Y2) _ 
            } _ 
         Equals New With { _ 
              Key .X = CDbl(e2.EntObj.X1), _ 
              Key .Y = CDbl(e2.EntObj.Y1) _ 
             } 

キーフィールドは、2つの匿名型への参照を比較する代わりに、同等性テストの値によって比較されます。

+0

ありがとうございました。 – Sreedhar

+0

私はこれ以上の+1を与えることができました、この問題( "キー"を持っていない)は私を一日中狂って運転しています – Mercurybullet

0

Widthクラスますか?はい?この場合、最初のクエリは参照によってオブジェクトを比較し、2番目のクエリは実際の値を比較します。 (...と参照がします - もちろん - 。あなたは、常に新しいインスタンスを作成するために一致することはありません)

+0

"New With"は、匿名オブジェクトを作成するためのVB.NETイディオムです。 – ichiban

+0

知っておいて(私はC#開発者です)...私は誤字を想定していました。この場合、私は完全に間違っています。 –

関連する問題