你可以用這兩種方法。使用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
爲同一類型,或許多不同類型。如果你這麼做,你可能只想考慮緩存。
什麼是你想實現什麼? – GerManson 2010-05-04 17:55:45
你想讓查詢在句子中做什麼? – hunter 2010-05-04 17:55:48
你的關鍵選擇器*方式太複雜。如果你想通過id來選擇,只需要x => x.ID即可。 – 2010-05-04 18:00:50