Można to zrobić na dwa sposoby. Korzystając z LINQPad (nieoceniony, jeśli dopiero zaczynasz korzystać z LINQ) i sztucznej bazy danych, stworzyłem następujące zapytania:
Posts.Join(
Post_metas,
post => post.Post_id,
meta => meta.Post_id,
(post, meta) => new { Post = post, Meta = meta }
)
lub
from p in Posts
join pm in Post_metas on p.Post_id equals pm.Post_id
select new { Post = p, Meta = pm }
W tym konkretnym przypadku myślę, że składnia LINQ jest czystsza (zmieniam się między nimi w zależności od tego, który jest najłatwiejszy do odczytania).
Chciałbym jednak zauważyć, że jeśli masz odpowiednie klucze obce w bazie danych (między post a post_meta), prawdopodobnie nie potrzebujesz jawnego łączenia, chyba że próbujesz załadować dużą liczbę rekordów . Twój przykład wydaje się wskazywać, że próbujesz załadować pojedynczy post i jego metadane. Zakładając, że dla każdego postu istnieje wiele rekordów post_meta, możesz wykonać następujące czynności:
var post = Posts.Single(p => p.ID == 1);
var metas = post.Post_metas.ToList();
Jeśli chcesz uniknąć problemu n + 1, możesz jawnie powiedzieć LINQ do SQL, aby ładował wszystkie powiązane elementy za jednym razem (chociaż może to być zaawansowany temat, gdy lepiej znasz L2S). Poniższy przykład mówi „gdy ładujesz Post, załaduj również wszystkie powiązane z nim rekordy za pomocą klucza obcego reprezentowanego przez właściwość„ 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
Możliwe jest wykonywanie wielu LoadWith
połączeń na jednym zestawie DataLoadOptions
dla tego samego typu lub wielu różnych typów. Jeśli robisz to dużo, możesz po prostu rozważyć buforowanie.