2011-03-28 23 views
7

Tengo problemas con esto, he intentado seguir varios ejemplos pero simplemente no lo estoy obteniendo. Tiene mucho sentido usar la forma no lambda, pero ¿cómo puedo unirme usando expresiones lambda?Linq a SQL lambda join

var myCats = GetAllCats(); 
var myHouses = GetAllHouses(); 

// pseudosql: select * from a inner join b on a.id = b.id 

He intentado esto:

var fullData = myCats.Join(myHouses, a => a.id, b => b.id, (a, b) => a); 

cual tipo de conseguí a través mirar otros ejemplos en que sí, pero es de tipo fullData IEnumerable<Cat> por lo que no se puede tirar de las propiedades de las casas fuera de él.

Respuesta

28
var fullData = myCats.Join(
       myHouses, 
       cat => cat.id, 
       house => house.id, 
       (cat, house) => 
        new 
        { 
        Cat = cat, 
        House = house 
        }); 

Acceso por fullData.First().Cat... o fullData.First().House....

+0

Awesome thanks! – NibblyPig

+6

Gracias por usar variables con más contexto que 'foo' y' bar'. –

+0

también cambió los parámetros lambda, por lo que es más legible. – Femaref

5

Eso es debido a que el argumento final (a, b) => a significa asignar el resultado de retorno a los gatos, es decir, que es (cat, house) => cat

Usted puede devolver un objeto temporal con la pareja, por ejemplo,

(cat, house) => new { cat, house } 
6

El problema es, que el resultado de su unirse - el último parámetro del método de Ingreso - es un Cat, por eso fullData es de tipo IEnumerable<Cat>. Si desea acceder a ambos, devuelva un tipo anónimo:

var fullData = myCats.Join(myHouses, a => a.id, 
            b => b.id, 
            (a, b) => new { Cat = a, House = b}); 
5

Debe definir exactamente qué es lo que quiere seleccionar de ellos.

Puede cambiar su último a:

var fullData = myCats.Join(myHouses, cat => cat.id, house => house.id, (cat, house) => new {cat, house}) 

lo que hará que fullData IQueryable de un tipo anónimo que se parece a:

class anonymous 
{ 
    Cat cat, 
    House house 
} 

El equivalente en formato LINQy es:

from cat in myCats join house in myHouses 
    on cat.id equals house.id 
    select new {cat, house} 

También puede especificar lo que desea seleccionar, para evitar el desperdicio:

from cat in myCats join house in myHouses 
    on cat.id equals house.id 
    select new {cat.id, cat.name, house.address}