实体框架中的多对多查询
本文关键字:查询 框架 实体 | 更新日期: 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作为导航项。
如果:
- 您从数据库生成了一个模型(所以而不是 model-first)
- 连接表包含两个外键(没有额外的列)
- 外键设置正确
:
- EF会为你生成类,包含所谓的导航属性在"两边"。BlogPost上的一个导航属性(item的集合)和一个nav.prop。
:
- 可以双向遍历对象图。获取特定项目的所有博客文章,或者以其他方式获取特定博客文章的所有项目。
所以当你有你的特定项目时,你可以创建一个相关的博客文章集合:
Item item = context.Items.Include("BlogPosts").FirstOrDefault<Item>(i => i.ID = someID)
现在您已经有了一个特定的条目,其中填充了博客文章的集合(如果有与该条目相关的)