Frage
Ich habe 2 Tabellen in SQL.
Table 1
Step Id
Step Name
Table 2
Profile Id
Step Id
Completed
Ich mag die folgenden Ergebnisse auch zurück, wenn es sich in der Tabelle nicht überein 2:
Results
Table1.Step Id
Table1.Step Name
Table2.Profile Id
Table2.Completed
So wie ich dies in SQL tue, ist die folgende:
select * from [Table 1] t1
left join [Table 2] t2
on t1.Step Id = t2.Step Id
Dies erzeugt die Ergebnisse erwarte ich.
Als ich übersetzen diese in 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();
}
Es funktioniert aber wie ein JOIN kein LEFT JOIN. Ich bekomme nur Ergebnisse zurück entspricht.
Auch ist UserCompletion ein Objekt, das ich von dieser Methode zurück.
Ich habe auf das meinen Kopf wurde hämmert für ein paar Tage ... jede mögliche Hilfe würde geschätzt.
Lösung
Sie könnten auch versuchen, dieses (unter der Annahme us.Completed ist 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
};
Dies wird nicht wiederum in in SQL Join, sondern eine verschachtelte SELECT-Anweisung etwas wie folgt aus:
select
StepId, Headline, ProfileId,
isnull((select top(1) Completed from userStep where StepId = Id), 0) as Completed
from step
Andere Tipps
Versuchen Sie etwas entlang der Linien der folgenden Optionen:
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 { ... }
Gefunden es.
Es scheint, als hätte ich eine Bewertung auf das Element hinzufügen müssen, dass „möglicherweise“ null sein.
Ich habe folgendes meine select
Completed = (x == null) ? String.Empty : x.Completed