Vous pouvez aller de deux façons avec cela. En utilisant LINQPad (inestimable si vous êtes nouveau sur LINQ) et une base de données factice, j'ai construit les requêtes suivantes:
Posts.Join(
Post_metas,
post => post.Post_id,
meta => meta.Post_id,
(post, meta) => new { Post = post, Meta = meta }
)
ou
from p in Posts
join pm in Post_metas on p.Post_id equals pm.Post_id
select new { Post = p, Meta = pm }
Dans ce cas particulier, je pense que la syntaxe LINQ est plus propre (je change entre les deux en fonction de ce qui est le plus facile à lire).
La chose que je voudrais souligner cependant, c'est que si vous avez des clés étrangères appropriées dans votre base de données (entre post et post_meta), vous n'avez probablement pas besoin d'une jointure explicite, sauf si vous essayez de charger un grand nombre d'enregistrements . Votre exemple semble indiquer que vous essayez de charger une seule publication et que ce sont des métadonnées. En supposant qu'il existe de nombreux enregistrements post_meta pour chaque publication, vous pouvez effectuer les opérations suivantes:
var post = Posts.Single(p => p.ID == 1);
var metas = post.Post_metas.ToList();
Si vous voulez éviter le problème n + 1, vous pouvez explicitement dire à LINQ to SQL de charger tous les éléments associés en une seule fois (bien que cela puisse être un sujet avancé lorsque vous êtes plus familier avec L2S). L'exemple ci-dessous dit "lorsque vous chargez une publication, chargez également tous ses enregistrements qui lui sont associés via la clé étrangère représentée par la propriété '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
Il est possible de faire de nombreux LoadWith
appels sur un même ensemble de DataLoadOptions
pour le même type, ou de nombreux types différents. Si vous faites cela cependant, vous voudrez peut-être simplement envisager la mise en cache.