C# 实体框架4中的多对多查询
我的数据库中存在多对多关系。这两个表是BoestPrand和Tebe,中间的表是ItByBrgPoST。我需要取回所有与特定项目相关的博客帖子。在SQL中,我会这样做:C# 实体框架4中的多对多查询,c#,entity-framework,entity-framework-4,linq-to-entities,C#,Entity Framework,Entity Framework 4,Linq To Entities,我的数据库中存在多对多关系。这两个表是BoestPrand和Tebe,中间的表是ItByBrgPoST。我需要取回所有与特定项目相关的博客帖子。在SQL中,我会这样做: SELECT BlogPost.* FROM BlogPost JOIN ItemBlogPost ON BlogPost.ID = ItemBlogPost.BlogPost_ID WHERE ItemBlogPost.Item_ID = @Item_ID 在C中,我有类似的东西: IQueryable<Blo
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.Containsitem,但也失败了。如何在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,所以它应该为您处理多对多映射,并且您应该在item对象中将BlogPosts作为导航项 如果:
您从数据库生成了一个模型,所以不是先生成模型
连接表只包含两个外键,没有附加列
外键设置正确
然后:
EF将为您生成两侧都包含所谓导航属性的类。BlogPost上项目的导航属性集合和nav.prop。关于项目的博客帖子的集合。
这样:
可以双向遍历对象图。获取特定项目的所有blogpost,或者以其他方式获取特定blogpost的所有项目。
因此,当您手头有特定项目时,您可以通过以下操作创建相关博客帖子的集合:
Item item = context.Items.Include("BlogPosts").FirstOrDefault<Item>(i => i.ID = someID)
现在,您有了一个特定的项目,其中包含与此项目相关的博客帖子集合。首先加载一个项目,然后对延迟加载相关的博客帖子执行第二次查询。如果您不想延迟加载,您可以使用Include选项。如果设置了多对多关系,应该是item.BlogPosts,不是吗?