2010-08-23 9 views
15

Je suis aux prises avec une clause join/where avec une instruction sql select assez simple.LINQ Join Where Clause

J'essaie de récupérer une liste d'informations produit de tb1 avec la condition where située derrière dans tbl2 mais cela doit être rejoint par trois colonnes différentes.

de sorte que le SQL ressemblerait à quelque chose le long des lignes de:

SELECT  tb1.* 
FROM   tb2 INNER JOIN 
         tb1 ON tb2.Col1 = tb1. Col1 AND tb2.Col2 = tb1. Col2 AND 
         tb2.Col3 = tb1.Col3 
WHERE  (tb2.Col1 = col1) AND (tb2.Col2 = col2) AND (tb2.Col4 = string) 

colx est la principale clause where avec la chaîne à passer en tant que paramètre; toutes les autres colonnes sont dans les contextes.

Comment implémenter plusieurs jointures avec une clause where?

Et pousse dans la bonne direction, très appréciée.

Répondre

42

Pour rejoindre sur le champ multiple dans LINQ, vous devez créer un nouveau type anonyme contenant les colonnes que vous souhaitez comparer et ensuite utiliser ce type anonyme dans la jointure:

var results = from t1 in context.tb1 
       join t2 in context.tb2 
       on new { t1.Col1, t1.Col2, t1.Col3 } equals 
        new { t2.Col1, t2.Col2, t2.Col3 } 
       where t2.Col1 == col1 && t2.Col2 == col2 && t2.Col4 == someString 
       select t1; 

Et voici l'équivalent Lambda Syntaxe:

var results = context.tb1.Join(
        context.tb2, 
        t1 => new { t1.Col1, t1.Col2, t1.Col3 }, 
        t2 => new { t2.Col1, t2.Col2, t2.Col3 }, 
        (t1, t2) => new { t1, t2 }) 
       .Where(o => o.t2.Col1 == col1 
        && o.t2.Col2 == col2 
        && o.t2.Col4 == someString) 
       .Select(o => o.t1); 

Comme vous pouvez le voir, dans le cas des jointures, la syntaxe de la requête produit généralement une instruction plus facile à lire.

+0

Légende - merci Justin. Je pense que si j'avais continué à gratter pendant encore 3 heures, un essai et une erreur m'auraient fait venir ici !! Merci beaucoup. –

+0

Est-il possible de faire cela dans la structure de la méthode (interfaces fluides)? –

+1

@Maxim Zaslavsky - Voulez-vous dire utiliser Lambda Syntax? –

7

Vous pouvez également inclure la clause WHERE dans la syntaxe lamda dans la référence à la table à laquelle vous vous joignez.

 var query = from pt in dc.ProjectTasks 
        join ttab in dc.TimeTaskAssigns on pt.Id equals ttab.ProjectTaskId 
        join ttb2 in dc.CMS_TAT_TIMEs.Where(a => a.WIP_STATUS == 'B') on ttab.CmsTimeUno equals ttb2.TIME_UNO 
        select pt; 

Cela semble évident maintenant, n'est-ce pas? Il m'a fallu beaucoup de temps pour trouver cette solution.