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