Potresti andare in due modi con questo. Utilizzando LINQPad (prezioso per chi non conosce LINQ) e un database fittizio, ho creato le seguenti query:
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 }
In questo caso particolare, penso che la sintassi LINQ sia più pulita (cambio tra i due a seconda di quale è più facile da leggere).
La cosa che vorrei sottolineare è che se nel tuo database sono presenti chiavi esterne appropriate (tra post e post_meta), probabilmente non avrai bisogno di un join esplicito a meno che tu non stia tentando di caricare un numero elevato di record . Il tuo esempio sembra indicare che stai cercando di caricare un singolo post e i suoi metadati. Supponendo che ci siano molti record post_meta per ogni post, è possibile effettuare le seguenti operazioni:
var post = Posts.Single(p => p.ID == 1);
var metas = post.Post_metas.ToList();
Se vuoi evitare il problema n + 1, puoi esplicitamente dire a LINQ to SQL di caricare tutti gli elementi correlati in una volta (anche se questo potrebbe essere un argomento avanzato per quando hai più familiarità con L2S). L'esempio seguente dice "quando carichi un Post, carica anche tutti i suoi record ad esso associati tramite la chiave esterna rappresentata dalla proprietà '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
È possibile effettuare più LoadWith
chiamate su un singolo set dello DataLoadOptions
stesso tipo o su molti tipi diversi. Se lo fai spesso, potresti prendere in considerazione la memorizzazione nella cache.