tutorial query left inner español ejemplos linq-to-sql ef-fluent-api

linq to sql - query - ¿Cómo hacer un join en linq a sql con sintaxis de método?



linq join c# ejemplos (3)

Justin ha mostrado correctamente la expansión en el caso en que la unión es seguida por una select . Si tiene algo más, se vuelve más complicado debido a los identificadores transparentes , el mecanismo que el compilador de C # usa para propagar el alcance de ambas mitades de la unión.

Entonces, 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 });

La z aquí es el identificador transparente, pero como es transparente, no se puede ver en la consulta original :)

He visto muchos ejemplos en los ejemplos de LINQ a SQL sobre cómo hacer un join en la sintaxis de la 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() ? ¿Alguien puede ilustrar u ofrecer otro ejemplo simple?


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 sea 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 que están en la lista de entrada.

Sé que esto es un poco más complejo que lo que el asker original estaba buscando, pero espero que ayude a alguien.


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 las consultas suele ser mucho más legible que la sintaxis lambda.