【问题标题】:Many to Many Query in Entity Framework 4Entity Framework 4 中的多对多查询
【发布时间】:2011-04-07 20:34:51
【问题描述】:

我的数据库中有一个多对多的关系。两个结束表是 BlogPost 和 Item,中间的表是 ItemBlogPost。我需要取回与特定项目相关的所有博客帖子。在 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 to EF4 中完成这项工作?

【问题讨论】:

  • 如果你设置了多对多的关系,它应该只是item.BlogPosts,不是吗?

标签: c# entity-framework entity-framework-4 linq-to-entities


【解决方案1】:

这个呢:

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);

【讨论】:

    【解决方案2】:

    你可以这样做吗:

    var itemBlogPosts = connection.Items.Single(b => b.ID == item.ID).BlogPosts;
    

    由于您使用的是 EF,它应该为您处理多对多映射,并且您应该将 BlogPosts 作为您的项目对象中的导航项目。

    【讨论】:

    • 首先加载一个项目然后执行第二个查询以延迟加载相关的博客文章。
    • 如果你不想延迟加载,你可以使用 Include() 选项。
    【解决方案3】:

    如果:

    1. 您从数据库生成了一个模型(所以不是模型优先)
    2. 连接表正好包含两个外键(没有附加列)
    3. 外键设置正确

    然后:

    1. EF 会为您生成包含“两侧”的所谓导航属性的类。 BlogPost 上的导航属性(项目集合)和 nav.prop。 (博客帖子的集合)在项目上。

    这边:

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

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

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

    现在您有一个特定项目,其中包含已填充的博文集合(如果有与该项目相关)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      • 2021-07-20
      相关资源
      最近更新 更多