З цим можна піти двома шляхами. Використовуючи LINQPad (неоціненний, якщо ви новачок у LINQ) та манекену, я створив такі запити:
Posts.Join(
Post_metas,
post => post.Post_id,
meta => meta.Post_id,
(post, meta) => new { Post = post, Meta = meta }
)
або
from p in Posts
join pm in Post_metas on p.Post_id equals pm.Post_id
select new { Post = p, Meta = pm }
У цьому конкретному випадку я вважаю, що синтаксис LINQ є більш чистим (я змінююсь між двома залежно від того, яке простіше читати).
Хоча я хотів би зазначити, що якщо у вашій базі даних є відповідні зовнішні ключі (між поштою та post_meta), вам, мабуть, не потрібно явного приєднання, якщо ви не намагаєтеся завантажити велику кількість записів . Схоже, ваш приклад вказує на те, що ви намагаєтеся завантажити одну посаду і це метадані. Якщо припустити, що для кожної публікації існує багато записів post_meta, то можна зробити наступне:
var post = Posts.Single(p => p.ID == 1);
var metas = post.Post_metas.ToList();
Якщо ви хочете уникнути проблеми n + 1, тоді ви можете чітко сказати LINQ SQL, щоб завантажувати всі пов'язані елементи за один раз (хоча це може бути розширеною темою, коли ви більше знайомі з L2S). У наведеному нижче прикладі написано: "Коли ви завантажуєте повідомлення, також завантажуйте всі її записи, пов'язані з нею, за допомогою зовнішнього ключа, представленого властивістю" 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
Можна здійснити багато LoadWith
дзвінків на одному наборі одного DataLoadOptions
і того ж типу або на багатьох різних типах. Якщо ви робите це безліч, ви можете просто розглянути можливість кешування.