¿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?

Author: Sнаđошƒаӽ, 2010-07-10

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.

 257
Author: Justin Niessner,
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:)

 121
Author: Jon Skeet,
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.

 5
Author: John Meyer,
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