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.

War es hilfreich?

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 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top