C# 具有多个表和多对多关系的复杂EntityFramework查询

C# 具有多个表和多对多关系的复杂EntityFramework查询,c#,entity-framework-4,linq-to-entities,C#,Entity Framework 4,Linq To Entities,我花了很长时间让实体框架做我想做的事情。我正在编写一个提要聚合器,这样我就可以将多个rss提要添加到一个“提要列表”中,该列表将对所有单独的播客进行分组,并按pubDate排序 类(除FeedListFeed外,所有类都具有名为Id的标识列): 提要(Id是标识主键,具有列表项属性) FeedItem(Id是标识主键,与int FeedId和Feed Feed属性一样) FeedList(FeedListName是字符串,List Feeds属性) FeedListFeed(多对多链接表、Fee

我花了很长时间让实体框架做我想做的事情。我正在编写一个提要聚合器,这样我就可以将多个rss提要添加到一个“提要列表”中,该列表将对所有单独的播客进行分组,并按pubDate排序

类(除FeedListFeed外,所有类都具有名为Id的标识列):

  • 提要(Id是标识主键,具有列表项属性)
  • FeedItem(Id是标识主键,与int FeedId和Feed Feed属性一样)
  • FeedList(FeedListName是字符串,List Feeds属性)
  • FeedListFeed(多对多链接表、FeedListId和FeedId属性)
  • 这些映射似乎有效:

    modelBuilder.Entity<FeedListFeed>().HasKey(x => x.FeedId).HasKey(x => x.FeedListId);
    modelBuilder.Entity<FeedList>()
    .HasMany(fl => fl.Feeds).WithMany(f => f.FeedLists)
    .Map(t => t.MapLeftKey("FeedListId")
    .MapRightKey("FeedId")
    .ToTable("FeedListFeeds"));
    

    从映射中删除此行

    modelBuilder.Entity<FeedListFeed>()
                .HasKey(x => x.FeedId)
                .HasKey(x => x.FeedListId);
    

    2)(更重要的是)这一行让EF考虑<代码> FoeListFoest作为一个实体,它不在你的模型中。结果是EF为它创建了一个名为

    FeedListFeeds1
    的单独表,因为
    FeedListFeeds
    在多对多映射中保留为表名(
    .ToTable(“FeedListFeeds”)
    )。对于多对多映射,不需要为链接表创建类。链接表由EF内部管理

    编辑

    当然,您还可以完全删除
    FeedListFeed

    对于查询,我将尝试:

    var query = from fi in ctx.FeedItems
                where fi.Feed.FeedLists.Any(fl => fl.FeedListName == id)
                orderby fi.PubDate descending
                select fi;
    
    我认为您的模型类中有所有必要的导航属性,因此应该可以进行此查询

    modelBuilder.Entity<FeedListFeed>()
                .HasKey(x => x.FeedId)
                .HasKey(x => x.FeedListId);
    
    modelBuilder.Entity<FeedListFeed>()
                .HasKey(x => new { x.FeedId, x.FeedListId });
    
    var query = from fi in ctx.FeedItems
                where fi.Feed.FeedLists.Any(fl => fl.FeedListName == id)
                orderby fi.PubDate descending
                select fi;