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.
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