2011-12-14 6 views
4

Что было бы эквивалентно следующему запросу T-SQL в L2E с использованием выражений Lambda?LINQ Присоединиться к нескольким полям

Select * from a INNER JOIN b on a.Foo = b.Foo OR a.Foo = b.Bar 

Я хочу присоединиться к и Ь, когда a.Foo равно b.Foo ИЛИ b.Bar

Спасибо.

+1

Это [обычно ошибкой использовать 'Join' в LINQ для лиц] (http://blogs.teamb.com/craigstuntz/2010/01/13/ 38525 /). Но поскольку вы спрашиваете о созданных «Foo» и «Bar» вместо описания вашей реальной проблемы, с этим сложно справиться. –

+0

@CraigStuntz: Я использовал Foo и Bar, потому что они не имеют никакого значения в моем вопросе. FYI, '(a.ID = b.a_ID OR a.ID = b.ID)' это реальный Foo и Bar. – Kamyar

+0

Итак, каковы навигационные данные, связанные с этими идентификаторами? У вас есть? –

ответ

7

Вы не можете выполнить «или» стиль соединения в LINQ с фактическим предложением соединения. Все предложения join в LINQ являются equijoins. Ближайший вы можете прийти это где положение:

var query = from a in A 
      from b in B 
      where a.Foo == b.Foo || a.Foo == b.Bar 
      select new { a, b }; 
+0

Что значит * equijoin *? Equijoin - это оператор объединения, который использует только сравнения сравнений, но предикат ** объединения может содержать несколько условий **. Я ошибаюсь? –

+2

@MarekGrzenkowicz: К сожалению, мой нормальный источник ссылки для этого (wikipedia :) не дает достаточно подробностей. Но логически, equijoin с «AND» s можно рассматривать как equijoin с одним сравнением равенства на многоколоночном ключе (как вы его моделируете в LINQ). Соединение с «OR» s * не может быть видно таким образом. –

Смежные вопросы