您可以使用两种方法。使用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和post_meta之间),那么除非您试图加载大量记录,否则可能不需要显式联接。 。您的示例似乎表明您正在尝试加载单个帖子及其元数据。假设每个帖子有很多post_meta记录,那么您可以执行以下操作:
var post = Posts.Single(p => p.ID == 1);
var metas = post.Post_metas.ToList();
如果要避免n + 1问题,则可以明确地告诉LINQ to 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
。如果这样做很多,您可能只想考虑缓存。