2011-12-14 4 views
4

Quel serait l'équivalent de la requête T-SQL suivante dans L2E en utilisant les expressions Lambda?LINQ Joindre sur plusieurs champs

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

Je veux participer a et b lorsque a.Foo égal à b.Foo OU b.Bar

Merci.

+1

Il est [généralement une erreur d'utiliser 'Join' dans LINQ to Entities] (http://blogs.teamb.com/craigstuntz/2010/01/13/ 38525 /). Mais puisque vous posez des questions sur un «Foo» et un «Bar» inventés au lieu de décrire votre vrai problème, il est difficile de vous aider. –

+0

@CraigStuntz: J'ai utilisé Foo et Bar parce qu'ils n'ont aucune valeur dans ma question. FYI, '(a.ID = b.a_ID OU a.ID = b.ID)' c'est le vrai Foo et Bar. – Kamyar

+0

Alors, quelles sont les navigations liées à ces ID? Avez-vous des? –

Répondre

7

Vous ne pouvez pas faire de jointure de style "ou" dans LINQ avec une clause de jointure réelle. Toutes les clauses de jointure dans LINQ sont equijoins. Le plus proche vous pouvez venir est une clause where:

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

Que voulez-vous dire par * equijoin *? Equijoin est une déclaration de jointure qui utilise uniquement des comparaisons d'égalité, mais le prédicat de jointure ** peut contenir plusieurs conditions **. Ai-je tort? –

+2

@MarekGrzenkowicz: Malheureusement, ma source de référence normale pour cela (wikipedia :) ne donne pas assez de détails. Mais logiquement, un équijoin avec "AND" peut être vu comme un equijoin avec une seule comparaison d'égalité sur une clé multi-colonne (qui est comment vous modélisez dans LINQ). Une jointure avec "OR" s * ne peut pas être vue de cette façon. –