¿Cómo hacer una unión en linq a sql con sintaxis de método?
He visto muchos ejemplos en ejemplos de LINQ a SQL sobre cómo hacer una combinación en la sintaxis de consulta, pero me pregunto cómo hacerlo con la sintaxis del método? Por ejemplo, ¿cómo podría hacer lo siguiente
var result = from sc in enumerableOfSomeClass
join soc in enumerableOfSomeOtherClass
on sc.Property1 equals soc.Property2
select new { SomeClass = sc, SomeOtherClass = soc }
Con un .Join()
? ¿Puede alguien ilustrar o dar otro ejemplo sencillo?
3 answers
var result = from sc in enumerableOfSomeClass
join soc in enumerableOfSomeOtherClass
on sc.Property1 equals soc.Property2
select new { SomeClass = sc, SomeOtherClass = soc };
Sería equivalente a:
var result = enumerableOfSomeClass
.Join(enumerableOfSomeOtherClass,
sc => sc.Property1,
soc => soc.Property2,
(sc, soc) => new
{
SomeClass = sc,
SomeOtherClass = soc
});
Como puede ver, cuando se trata de uniones, la sintaxis de consulta suele ser mucho más legible que la sintaxis lambda.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-20 09:58:44
Justin ha mostrado correctamente la expansión en el caso en el que la unión es seguida por un select
. Si tienes algo más, se vuelve más complicado debido a identificadores transparentes - el mecanismo que el compilador de C# usa para propagar el alcance de ambas mitades de la combinación.
Así que para cambiar ligeramente el ejemplo de Justin:
var result = from sc in enumerableOfSomeClass
join soc in enumerableOfSomeOtherClass
on sc.Property1 equals soc.Property2
where sc.X + sc.Y == 10
select new { SomeClass = sc, SomeOtherClass = soc }
Se convertiría en algo como esto:
var result = enumerableOfSomeClass
.Join(enumerableOfSomeOtherClass,
sc => sc.Property1,
soc => soc.Property2,
(sc, soc) => new { sc, soc })
.Where(z => z.sc.X + z.sc.Y == 10)
.Select(z => new { SomeClass = z.sc, SomeOtherClass = z.soc });
El z
aquí está el identificador transparente, pero como es transparente, no se puede ver en la consulta original:)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-10 06:10:19
Para agregar a las otras respuestas aquí, si desea crear un nuevo objeto de un tercer tipo diferente con una cláusula where (por ejemplo, una que no es su objeto Entity Framework) puede hacer esto:
public IEnumerable<ThirdNonEntityClass> demoMethod(IEnumerable<int> property1Values)
{
using(var entityFrameworkObjectContext = new EntityFrameworkObjectContext )
{
var result = entityFrameworkObjectContext.SomeClass
.Join(entityFrameworkObjectContext.SomeOtherClass,
sc => sc.property1,
soc => soc.property2,
(sc, soc) => new {sc, soc})
.Where(s => propertyValues.Any(pvals => pvals == es.sc.property1)
.Select(s => new ThirdNonEntityClass
{
dataValue1 = s.sc.dataValueA,
dataValue2 = s.soc.dataValueB
})
.ToList();
}
return result;
}
Preste especial atención al objeto intermedio que se crea en las cláusulas Where y Select.
Tenga en cuenta que aquí también buscamos cualquier objeto unido que tenga una propiedad1 que coincida con uno de los de la lista de entrada.
Sé que esto es un poco más complejo que lo que el asker original estaba buscando, pero con suerte ayudará a alguien.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-25 16:32:38