entity framework4中的多对多查询

我的数据库中有很多关系。 两个结束表是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 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. 您可以双向遍历对象图。 获取特定项目的所有博客post,或以其他方式获取特定博客文章的所有项目。

因此,当您手动拥有特定项目时,您可以通过以下方式创建相关博客的集合:

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

现在您有一个特定的项目,其中填充了博客post(如果有任何与此项目相关)。