คุณสามารถทำได้สองวิธีด้วยวิธีนี้ ใช้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
สำหรับประเภทเดียวกันหรือหลายประเภท หากคุณทำสิ่งนี้มากคุณอาจต้องการลองแคช