我有以下实体用于测试目的:-
- 博客实体
- 一个博客可以有多个评论。
- 每个评论可以有多个标签。
- 并且标签可以有多个相关标签。
所以我定义了以下内容来检索有关博客的所有相关信息:-
var blog = entities.Blogs.Include(v=>v.comments.Select(a =>a.tags));
但是我如何检索博客的“相关标签”?因为我只能为每个实体定义一个 Include 和一个 Select。谢谢
我有以下实体用于测试目的:-
所以我定义了以下内容来检索有关博客的所有相关信息:-
var blog = entities.Blogs.Include(v=>v.comments.Select(a =>a.tags));
但是我如何检索博客的“相关标签”?因为我只能为每个实体定义一个 Include 和一个 Select。谢谢
我不知道您的数据库的结构是什么以及博客类的外观如何,所以我只是为您的要求绘制了简单的数据库结构并将数据检索到匿名对象中:
var blogID = 1;
var blog = entities.Blogs.Where(b=>b.ID == blogID).Select(b=> new {
BlogID = b.BlogID,
Comments = b.Comments.Select(c=>new {
CommentID = c.CommentID,
Tags = c.Tags.Select(t=>new {
TagID = t.TagID,
Name = t.Name,
RelatedTags = t.Tags1.Select(tg => new {
TagID = tg.TagID,
Name = tg.Name
})
})
})
})
当您需要在数据上下文中急切地加载一些附加数据时,该.Include()
运算符很有用。例如:
var blog = var blog = entities.Blogs.Include("Comments").FirstOrDefault(b=>b.ID == blogID); //Query is executing here and getting also comments related to the blog
//then you can go through comment without any additional queries:
foreach(var comment in blog.Comments)
{
//no queries executed here
}
编辑:是的,这是可能的。如果您使用的是 DbContextAPI,则需要执行以下操作:
//here is tags1 is navigation property for related tags
var blog = entities.Blogs.Include(v=>v.comments.Select(a =>a.tags.Select(t=>t.tags1)));
//Or with ObjectContext .Include() method:
//here is tags1 is navigation property for related tags
var blog1 = entities.Blogs.Include("comments.tags.tags1").FirstOrDefault(b=>b.BlogID = blogID);
您可以在实体上拥有的包含数量没有限制,您可以使用 SelectMany 或子选择来选择相关标签。
var blog = entities.Blogs.Include(v=>v.comments.Select(a =>a.tags.Select(t=>t.relatedtags));