Buenos días.
Básicamente lo que necesitaba era unir dos listas, en ambas podía referenciarlas por dos valores, por lo cual era necesario crear una tabla nueva con los valores unidos.
Este post lo partiré con respecto a lo encontrado en internet y en la parte final colocare la forma como me ha funcionado.
Primer referencia encontrada:
Haciendo una consulta Linq con Entity Framework, he encontrado un problemilla que me ha costado algo de tiempo solucionarlo, y creo que era digno merecedor de una entrada en el blog.
Estaba haciendo una consulta join a 2 tablas con clave compuesta.
var listaCentro = from f in ctx.Facturas
join c in ctx.CentroCoste
on new { f.empresa, f.centroCoste } equals new { c.empresa, c.centro}
select new {c.empresa, c.nombre};
y me aparecía el siguiente error:
“El tipo de una de las expresiones de la cláusula join es incorrecto. No se pudo inferir el tipo en la llamada a 'Join'”
El MSDN me sugería que verificara los tipos del join, comprobando que fueran del mismo tipo las parejas f.empresa, c.empresa y f.centroCoste, c.centro.
Comprobado esto, seguí buscando y me encontré con la siguiente frase:
“La inferencia de tipos en claves compuestas depende de los nombres de las propiedades en las claves y del orden en el que ocurren”
Las claves f.empresa coinciden con c.empresa, pero f.centroCoste no coincide con c.centro, y debían de coincidir.
La solución estaba en poner nombre a las propiedades de las clases anónimas que usamos para las claves compuestas.
var listaCentro = from f in ctx.Facturas
join c in ctx.CentroCoste
on new { emp = f.empresa, centro = f.centroCoste } equals new { emp = c.empresa,centro = c.centro}
select new {c.empresa, c.nombre};
Enlace al artículo MSDN que habla sobrer las claves compuestas:
http://msdn.microsoft.com/es-es/library/bb907099.aspx Segunda referencia encontrada:var query = from p in context.T1
join q in context.T2
on
new { p.Col1, p.Col2 }
equals
new { q.Col1, q.Col2 }
select new {p...., q......};
Solución Propia:
var Tablanueva = (from i in Item
join u in Usuario
on i.Servicio
.Id equals u.IdServicio
where
i.Id == u.IdItem
select new
{
u.IdItem,
u.Dia,
u.IdServicio,
i.FechaInicio,
u.Login,
i.Valor
}
).ToList();
Fuentes:
Primer referencia: http://www.overflowexception.es/2011/08/unir-2-tablas-usando-linq-y-claves.html
Segunda referencia: http://stackoverflow.com/questions/373541/how-to-do-joins-in-linq-on-multiple-fields-in-single-join
Extras:
http://www.esasp.net/2010/02/linq-distinct-except-intersect-union.html
http://stackoverflow.com/questions/5307731/linq-to-sql-multiple-joins-on-multiple-columns-is-this-possible
http://www.esasp.net/2010/02/left-join-linq.html
https://danielggarcia.wordpress.com/2013/11/21/sentencias-en-linq-iii-agrupaciones-group-by/
http://kartones.net/blogs/sector7g/sintaxis-linq-union-intersect-y-except.aspx