C# 在实体框架中联接3个一对多表

C# 在实体框架中联接3个一对多表,c#,entity-framework,linq,join,many-to-many,C#,Entity Framework,Linq,Join,Many To Many,我有两个表,每个表与中间的表有一对多的关系,中间的表有另外两个表的ID dbo.Posts dbo.Posts_Categories dbo.Categories -ID -ID -ID -Title -PostID -Name -CategoryID 我

我有两个表,每个表与中间的表有一对多的关系,中间的表有另外两个表的ID

dbo.Posts          dbo.Posts_Categories          dbo.Categories
   -ID                -ID                           -ID
   -Title             -PostID                       -Name
                      -CategoryID
我预期的结果是:

Title = post1          Categories = web,mobile,desktop
Title = post2          Categories = app,game
...
我知道如何在sql中使用Stuff函数和For Xml Path查询,但我不知道如何在实体框架中执行此操作

任何关于如何以这种方式工作的建议或书籍都可能有所帮助

编辑:添加了EF类:

    public class Post : ReportingBase {
        public Post() { }

        [Required, MaxLength(500)]
        public string Title { get; set; }
        [Required, MaxLength(500)]
        public string Address { get; set; }
        [Required]
        public string Body { get; set; }
        [Required, MaxLength(500)]
        public string Tags { get; set; }
        [Required]
        public int Visit { get; set; }



        public virtual ICollection<Post_Category> Posts_Categories { get; set; }
        public virtual ICollection<Post_AttachedFile> Posts_AttachedFiles { get; set; }

        [ForeignKey("Image")]
        public virtual int? ImageID { get; set; }
        public virtual Image Image { get; set; }
    }

    public class Post_Category {
        public Post_Category() { }

        [Key, Column(Order = 0)]
        public int PostID { get; set; }

        [Key, Column(Order = 1)]
        public int CategoryID { get; set; }

        public virtual Post Post { get; set; }
        public virtual Category Category { get; set; }
    }

    public class Category : EntityBase {
        public Category() { }

        [Required, MaxLength(50)]
        public string Name { get; set; }

        [Required, MaxLength(150)]
        public string Address { get; set; }
        public int? ParentID { get; set; }



        public virtual ICollection<Post_Category> Posts_Categories { get; set; }
    }
公共类帖子:ReportingBase{ 公共邮政(){} [必需,最大长度(500)] 公共字符串标题{get;set;} [必需,最大长度(500)] 公共字符串地址{get;set;} [必需] 公共字符串体{get;set;} [必需,最大长度(500)] 公共字符串标记{get;set;} [必需] 公共int访问{get;set;} 公共虚拟ICollection Posts_Categories{get;set;} 公共虚拟ICollection Posts_AttachedFiles{get;set;} [外键(“图像”)] 公共虚拟int?ImageID{get;set;} 公共虚拟映像映像{get;set;} } 公开课邮务组{ 公共邮政类别(){} [键,列(顺序=0)] 公共int PostID{get;set;} [键,列(顺序=1)] public int CategoryID{get;set;} 公共虚拟Post{get;set;} 公共虚拟类别{get;set;} } 公共类类别:EntityBase{ 公共类别(){} [必需,最大长度(50)] 公共字符串名称{get;set;} [必需,最大长度(150)] 公共字符串地址{get;set;} public int?ParentID{get;set;} 公共虚拟ICollection Posts_Categories{get;set;} } 先谢谢你

编辑:根据@IvanStoev的回答,我做了以下工作:

    List<P> p = context.Posts.Select(post => new {
        Title = post.Title,
        Categories = post.Posts_Categories.Select(pc => pc.Category.Name).ToList()
    }).ToList();
List

P=context.Posts.Select(post=>new{ Title=post.Title, Categories=post.Posts\u Categories.Select(pc=>pc.Category.Name).ToList() }).ToList();

创建了一个名为p的类:

public class P {
    public string Title { get; set; }
    public List<string> Categories { get; set; }
}
公共类P{
公共字符串标题{get;set;}
公共列表类别{get;set;}
}
但是它不能正常工作,问题是如何返回结果。

您可以使用Linqpad(软件)来熟悉Linq查询,它通过连接到数据库为您构建lambda表达式,并提供输出以进行交叉验证

下面是用于连接您提到的表的lambda表达式

p - Post  
pc - post_categories
c - categories
代码:

您可以使用Linqpad(软件)来熟悉Linq查询,它通过连接到数据库为您构建lambda表达式,并提供输出以进行交叉验证

下面是用于连接您提到的表的lambda表达式

p - Post  
pc - post_categories
c - categories
代码:


在EF中,由于所谓的。您所需要知道的只是一个基本的LINQ查询语法,只需遵循它们(导航)即可获得所需的数据。例如:

var result = db.Posts
    .Select(post => new
    {
        Title = post.Title,
        Categories = post.Posts_Categories
            .Select(pc => pc.Category.Name)
            .ToList()
    })
    .ToList();

结果是一个匿名类型的列表,具有
string
Title属性和
list
Categories属性,其中包含相关的类别名称。

由于所谓的。您所需要知道的只是一个基本的LINQ查询语法,只需遵循它们(导航)即可获得所需的数据。例如:

var result = db.Posts
    .Select(post => new
    {
        Title = post.Title,
        Categories = post.Posts_Categories
            .Select(pc => pc.Category.Name)
            .ToList()
    })
    .ToList();

结果是一个匿名类型的列表,具有
string
Title属性和
list
Categories属性,其中包含相关的类别名称。

为了帮助进行EF查询,我们需要EF模型(类、流畅配置等),而不是db表。我添加了实体@IvanStoevWell,为了帮助进行EF查询,我们需要EF模型(类、fluent配置等),而不是db表。我添加了entities@IvanStoevit似乎可以工作,但我不知道如何返回它!我的意思是我不知道什么是结果类型@Ivanstoev只要创建一个类-
公共类SomeClass{public string Title{get;set;}公共列表类别{get;set;}}
并使用
post=>新建SomeClass{…}
。结果类型将是
列表
。啊,我看到了你的编辑-你快到了,忘了在
新的
之后添加
P
:)它似乎可以工作,但我不知道如何返回它!我的意思是我不知道什么是结果类型@Ivanstoev只要创建一个类-
公共类SomeClass{public string Title{get;set;}公共列表类别{get;set;}}
并使用
post=>新建SomeClass{…}
。结果类型将是
列表
。啊,我看到了你的编辑-你快到了,忘了在
新的
之后添加
P
:)