multiple left inner ejemplos conditions c# .net linq join

left - linq join c# ejemplos



.NET Linq Unirse (3)

Lo encontré.

Parece que necesito agregar una evaluación sobre el elemento que "puede" ser nulo.

Agregué lo siguiente a mi selección

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

Tengo 2 tablas en SQL.

Table 1 Step Id Step Name Table 2 Profile Id Step Id Completed

Me gustaría devolver los siguientes resultados, incluso si no hay coincidencia en la tabla 2:

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

La forma en que hago esto en SQL es la siguiente:

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

Esto produce los resultados que espero.

Cuando traduzco esto a 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(); }

Funciona pero como un JOIN no es un left join. Solo obtengo resultados coincidentes.

Además, UserCompletion es un objeto que devuelvo de este método.

He estado golpeando mi cabeza en esto por unos días ... cualquier ayuda sería apreciada.


Pruebe algo como lo siguiente:

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


También puedes probar esto (suponiendo que nosotros.Completado sea booleano):

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 };

Esto no se convertirá en una unión en sql, sino una declaración de selección anidada algo como esto:

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