C# 实体框架4中的多对多查询

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

我的数据库中存在多对多关系。这两个表是BoestPrand和Tebe,中间的表是ItByBrgPoST。我需要取回所有与特定项目相关的博客帖子。在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的行并没有提供项属性的列表,也没有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,不是吗?