2011-04-07 59 views
4

我在我的數據庫中有多對多的關係。兩個結束表是BlogPost和Item,中間的表是ItemBlogPost。我需要找回與特定項目相關的所有BlogPosts。在SQL我會做這樣的:實體框架中的多對多查詢4

SELECT BlogPost.* 
FROM BlogPost 
    JOIN ItemBlogPost ON BlogPost.ID = ItemBlogPost.BlogPost_ID 
WHERE ItemBlogPost.Item_ID = @Item_ID 

在C#我有類似的東西:

IQueryable<BlogPost> itemBlogPosts = from b in connection.BlogPosts 
            where b.Items == item.ID 
            orderby b.Content.CreateDate descending 
            select b; 

然而,行標b.Items不給我的項目屬性的列表和沒有b.ItemBlogPost查看中間表。我也試過b.Items.Contains(item),但那也失敗了。我如何在LINQ to EF4中完成這項工作?

+0

如果你建立了多對多的關係,它應該只是'item.BlogPosts',不是? – 2011-04-07 20:56:06

回答

22

這個什麼:

var itemBlogPosts = from i in connection.Items 
        from b in i.BlogPosts // I suppose you have a nav. property on Item 
        where i.Id == itemId 
        select b; 

同樣的查詢可以通過還定義:

var itemBlogPosts = connection.Items 
           .Where(i => i.Id == itemId) 
           .SelectMany(i => i.BlogPosts); 
2

你能只是這樣做:

var itemBlogPosts = connection.Items.Single(b => b.ID == item.ID).BlogPosts; 

由於您使用的EF它應該爲您處理多對多映射,並且您應該在您的項目對象中將BlogPosts作爲導航項目。

+0

該應該先加載一個項目,然後執行第二個查詢來延遲加載相關的博客文章。 – 2011-04-07 20:43:05

+0

如果你不想'延遲加載,你可以使用Include()選項。 – 2011-04-07 20:44:16

0

如果:

  1. 您產生從數據庫(這樣模型一)
  2. 連接表恰好包含兩個外鍵(無附加列)
  3. 的外鍵的典範以正確的方式分別設立了

然後:

  1. EF將爲您生成包含所謂的「雙方」導航屬性的類。 BlogPost上的導航屬性(Items的集合)和nav.prop。 (BlogPosts的集合)。

這樣:

  1. 可以遍歷對象圖雙向的。獲取特定項目的所有博客帖子,或以其他方式獲取某個博客帖子的所有項目。

所以,當你的手有你的特定項目,你只需做創建相關的相關博客文章的集合:

Item item = context.Items.Include("BlogPosts").FirstOrDefault<Item>(i => i.ID = someID) 

現在你有一個充滿相關博客文章的集合的特定項目(如果有的話是與此項目相關)。