实体框架中的多对多查询

本文关键字:查询 框架 实体 | 更新日期: 2023-09-27 17:49:14

我有一个多对多的关系在我的数据库。两个尾表分别是BlogPost和Item,中间的表是ItemBlogPost。我需要得到与特定项目相关的所有BlogPosts。在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到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. 您从数据库生成了一个模型(所以而不是 model-first)
  2. 连接表包含两个外键(没有额外的列)
  3. 外键设置正确

:

  1. EF会为你生成类,包含所谓的导航属性在"两边"。BlogPost上的一个导航属性(item的集合)和一个nav.prop。

:

  1. 可以双向遍历对象图。获取特定项目的所有博客文章,或者以其他方式获取特定博客文章的所有项目。

所以当你有你的特定项目时,你可以创建一个相关的博客文章集合:

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

现在您已经有了一个特定的条目,其中填充了博客文章的集合(如果有与该条目相关的)