Podrías ir de dos maneras con esto. Usando LINQPad (invaluable si eres nuevo en LINQ) y una base de datos ficticia, construí las siguientes consultas:
Posts.Join(
Post_metas,
post => post.Post_id,
meta => meta.Post_id,
(post, meta) => new { Post = post, Meta = meta }
)
o
from p in Posts
join pm in Post_metas on p.Post_id equals pm.Post_id
select new { Post = p, Meta = pm }
En este caso particular, creo que la sintaxis de LINQ es más limpia (cambio entre los dos dependiendo de cuál sea más fácil de leer).
Sin embargo, lo que me gustaría señalar es que si tiene claves foráneas apropiadas en su base de datos (entre post y post_meta), probablemente no necesite una unión explícita a menos que esté intentando cargar una gran cantidad de registros . Su ejemplo parece indicar que está intentando cargar una sola publicación y son metadatos. Suponiendo que hay muchos registros post_meta para cada publicación, puede hacer lo siguiente:
var post = Posts.Single(p => p.ID == 1);
var metas = post.Post_metas.ToList();
Si desea evitar el problema n + 1, puede decirle explícitamente a LINQ to SQL que cargue todos los elementos relacionados de una vez (aunque este puede ser un tema avanzado para cuando esté más familiarizado con L2S). El siguiente ejemplo dice "cuando cargue una publicación, también cargue todos sus registros asociados con ella a través de la clave externa representada por la propiedad 'Post_metas'":
var dataLoadOptions = new DataLoadOptions();
dataLoadOptions.LoadWith<Post>(p => p.Post_metas);
var dataContext = new MyDataContext();
dataContext.LoadOptions = dataLoadOptions;
var post = Posts.Single(p => p.ID == 1); // Post_metas loaded automagically
Es posible hacer muchas LoadWith
llamadas en un solo conjunto DataLoadOptions
para el mismo tipo, o muchos tipos diferentes. Sin embargo, si hace esto mucho, es posible que desee considerar el almacenamiento en caché.