2009-03-06 6 views
4

J'ai 2 tables dans SQL..NET Linq Join

Table 1 
Step Id 
Step Name 

Table 2 
Profile Id 
Step Id 
Completed 

Je voudrais revenir les résultats suivants, même si on correspond pas au tableau 2:

Results 
Table1.Step Id 
Table1.Step Name 
Table2.Profile Id 
Table2.Completed 

La façon dont je fais cela dans SQL est la suivante:

select * from [Table 1] t1 
left join [Table 2] t2 
on t1.Step Id = t2.Step Id 

Cela produit les résultats attendus.

Quand je traduis cela en LINQ:

public static List<UserCompletion> GetStepCompletion(string category, string profileid) { 

List<Step> step = GetSteps(category); 
List<UserStep> userStep = GetUserSteps(category, profileId);  

var q = from s in step 
     join us in userStep 
     on s.Id equals us.StepId 
     select new UserCompletion 
     { 
      StepId = s.Id, 
      Headline = s.StepName, 
      ProfileId = us.ProfileId 
      Completed= us.Completed 
      }; 

    return q.ToList(); 

} 

Il fonctionne, mais comme un JOIN pas une jointure gauche. Je n'ai que des résultats correspondants.

De même, UserCompletion est un objet que je retourne de cette méthode.

Je me suis cogné la tête pendant quelques jours ... toute aide serait appréciée.

Répondre

5

Vous pouvez également essayer (en supposant us.Completed est booléenne):

var q = from s in step 
     let us = (from i in userStep where s.Id = i.StepId).SingleOrDefault() 
     select new UserCompletion 
     { 
      StepId = s.Id, 
      Headline = s.StepName, 
      ProfileId = us.ProfileId 
      Completed = us == null ? false : us.Completed 
      }; 

Cela ne se transformer en une jointure sql, mais une instruction select imbriquée quelque chose comme ceci:

select 
    StepId, Headline, ProfileId, 
    isnull((select top(1) Completed from userStep where StepId = Id), 0) as Completed 
from step 
3

Essayez quelque chose le long des lignes de ce qui suit:

var q = from s in step 
     join us in userStep 
     on s.Id equals us.StepId into tmpjoin 
     from x in tmpjoin.DefaultIfEmpty() 
     select new UserCompletion { ... } 
+0

bien fait. J'essayais d'essayer d'obtenir la syntaxe exacte :) –

+0

Désolé, je ne voulais pas voler vos crédits :-) –

+0

J'ai essayé cela mais je reçois une exception nullreference sur la ligne select. - code ci-dessous var q = de s à l'étape nous rejoindre dans userStep sur s.Id est égal à nous.StepId dans tmpjoin de x dans tmpjoin.DefaultIfEmpty() select new UserStepAccepted {StepId = s.Id, Headline = s.StepName , Complété = x.Complété}; – jdruid

0

Trouvé.

On dirait que j'ai besoin d'ajouter une évaluation sur l'élément qui "peut" être nul.

j'ajouté ce qui suit à ma sélection

Completed = (x == null) ? String.Empty : x.Completed