2009-06-16 4 views
1

Являются ли следующие два запроса функционально одинаковыми? Первый не возвращает никаких данных, но второй работает отлично с одинаковым точным вводом. Может кто-нибудь указать, что не так в моем первом запросе?Linq Join on Mutliple Properties

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) _ 
             } 

ключевые поля будут сравниваться по значению для теста равенства вместо сравнения ссылок на два анонимных типа.

+0

Спасибо, что работает. – Sreedhar

+0

Жаль, что я мог бы дать это больше, чем +1, эта проблема (не имеющая «ключа») сбила меня с ума весь день – Mercurybullet

0

ли Width класс? Да? В этом случае первый запрос будет сравнивать объекты по ссылке, а второй будет сравнивать фактические значения. (... и ссылки не будут - конечно. - никогда не совпадают, потому что вы всегда создавать новый экземпляр)

+0

«New With» - это идиома VB.NET для создания анонимных объектов. – ichiban

+0

Полезно знать (я разработчик C#) ... Я предполагал опечатку. В этом случае я совершенно ошибаюсь. –