簡體   English   中英

實體框架4中的多對多查詢

[英]Many to Many Query in Entity Framework 4

我的數據庫中有很多關系。 兩個結束表是BlogPost和Item,中間的表是ItemBlogPost。 我需要找回與特定項目相關的所有BlogPost。 在SQL中,我會這樣做:

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的行沒有給出Item屬性的列表,並且沒有b.ItemBlogPost來查看中間表。 我也嘗試過做b.Items.Contains(item)但也失敗了。 如何在LINQ to EF4中完成這項工作?

那這個呢:

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);

你能做到這一點:

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

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

如果:

  1. 您從數據庫生成了一個模型(因此不是模型優先)
  2. 連接表恰好包含兩個外鍵(沒有附加列)
  3. 外鍵是以正確的方式設置的

然后:

  1. EF會為您生成包含“雙方”所謂導航屬性的類。 BlogPost上的導航屬性(Items集合)和nav.prop。 項目上的(BlogPosts集合)。

這條路:

  1. 您可以雙向遍歷對象圖。 獲取特定項目的所有博客帖子,或者獲取特定博客帖子的所有項目。

因此,當您手動擁有特定項目時,您可以通過以下方式創建相關博客帖子的集合:

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

現在您有一個特定的項目,其中填充了博客帖子(如果有任何與此項目相關)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM