Bạn có thể đi hai cách với điều này. Sử dụng LINQPad (vô giá nếu bạn chưa quen với LINQ) và cơ sở dữ liệu giả, tôi đã xây dựng các truy vấn sau:
Posts.Join(
Post_metas,
post => post.Post_id,
meta => meta.Post_id,
(post, meta) => new { Post = post, Meta = meta }
)
hoặc là
from p in Posts
join pm in Post_metas on p.Post_id equals pm.Post_id
select new { Post = p, Meta = pm }
Trong trường hợp cụ thể này, tôi nghĩ cú pháp LINQ sạch hơn (tôi thay đổi giữa hai tùy thuộc vào cách dễ đọc nhất).
Điều tôi muốn chỉ ra là nếu bạn có khóa ngoại thích hợp trong cơ sở dữ liệu của mình, (giữa post và post_meta) thì có lẽ bạn không cần tham gia rõ ràng trừ khi bạn cố tải một số lượng lớn hồ sơ . Ví dụ của bạn dường như cho thấy rằng bạn đang cố tải một bài đăng và đó là dữ liệu meta. Giả sử có nhiều bản ghi post_meta cho mỗi bài đăng, thì bạn có thể làm như sau:
var post = Posts.Single(p => p.ID == 1);
var metas = post.Post_metas.ToList();
Nếu bạn muốn tránh vấn đề n + 1, thì bạn có thể nói rõ ràng LINQ với SQL để tải tất cả các mục liên quan trong một lần (mặc dù đây có thể là một chủ đề nâng cao khi bạn quen thuộc hơn với L2S). Ví dụ bên dưới cho biết "khi bạn tải Bài đăng, cũng tải tất cả các bản ghi được liên kết với nó thông qua khóa ngoại được biểu thị bằng thuộc tính '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
Có thể thực hiện nhiều LoadWith
cuộc gọi trên một bộ DataLoadOptions
cho cùng một loại hoặc nhiều loại khác nhau. Nếu bạn làm điều này rất nhiều, bạn có thể chỉ muốn xem xét bộ nhớ đệm.