C# 在实体框架中联接3个一对多表
我有两个表,每个表与中间的表有一对多的关系,中间的表有另外两个表的IDC# 在实体框架中联接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 我
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();
ListP=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
:)