Question

J'ai 2 tables en SQL.

Table 1 
Step Id
Step Name

Table 2
Profile Id
Step Id
Completed

J'aimerais renvoyer les résultats suivants même s'il n'y a pas de correspondance dans le tableau 2:

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

Voici comment je le fais en SQL:

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

Ceci produit les résultats que j'attends.

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();

}

Cela fonctionne mais comme un JOIN, pas une jointure gauche. Je ne reçois que les résultats correspondants.

En outre, UserCompletion est un objet que je retourne à partir de cette méthode.

Je me frappe la tête à ce sujet depuis quelques jours ... toute aide serait la bienvenue.

Était-ce utile?

La solution

Vous pouvez également essayer ceci (en nous supposant.Completed is boolean):

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 transformera pas en une jointure dans SQL, mais en une instruction select imbriquée ressemblant à ceci:

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

Autres conseils

Essayez quelque chose dans le sens 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 { ... }

Je l'ai trouvé.

On dirait que je dois ajouter une évaluation à l'élément "peut". être nul.

J'ai ajouté ce qui suit à ma sélection

Completed = (x == null) ? String.Empty : x.Completed 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top