基于Entity Framework的REST API获取关注者博文技术问题
获取关注者发布的博文解决方案
嘿,我来帮你搞定这个需求!首先得把实体间的关系补全(毕竟你现在的实体里还没有关注关系和用户与博文的关联),然后用Fluent API配置好,最后就能轻松写出查询啦。
1. 完善实体定义
先给User实体添加关注相关的导航属性,还有用户与博文的关联;同时给BlogPost补上主键和显式外键,这样EF的映射会更清晰:
public class User { public string Id { get; set; } public string Email { get; set; } public string Password { get; set; } // 当前用户**关注的人**集合 public ICollection<User> Followings { get; set; } = new List<User>(); // 当前用户的**粉丝**集合 public ICollection<User> Followers { get; set; } = new List<User>(); // 当前用户发布的博文集合 public ICollection<BlogPost> BlogPosts { get; set; } = new List<BlogPost>(); } public class BlogPost { // 务必补上主键!EF需要实体有主键才能正常映射 public string Id { get; set; } public string Summary { get; set; } public string Body { get; set; } // 显式外键,关联发布者的Id public string CreatedById { get; set; } public User CreatedBy { get; set; } // 建议添加创建时间,方便按时间排序博文 public DateTime CreatedAt { get; set; } = DateTime.UtcNow; }
2. 用Fluent API配置关系
接下来在你的DbContext的OnModelCreating方法里配置这些实体关系,包括多对多的关注关系,还有一对多的用户-博文关系:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置User主键 modelBuilder.Entity<User>() .HasKey(u => u.Id); // 配置BlogPost主键 modelBuilder.Entity<BlogPost>() .HasKey(b => b.Id); // 配置用户与博文的一对多关系:一个用户可以发多篇博文,一篇博文属于一个用户 modelBuilder.Entity<BlogPost>() .HasOne(b => b.CreatedBy) .WithMany(u => u.BlogPosts) .HasForeignKey(b => b.CreatedById) .OnDelete(DeleteBehavior.Cascade); // 删除用户时,其发布的博文也会被删除,可根据需求调整 // 配置用户之间的关注多对多关系:中间表命名为UserFollowers modelBuilder.Entity<User>() .HasMany(u => u.Followings) .WithMany(u => u.Followers) .UsingEntity(j => j.ToTable("UserFollowers")); }
3. 编写查询获取关注者的博文
现在有两种方式可以查询,取决于你是否已经拿到了关注者列表:
方式一:直接从当前用户关联查询(推荐)
如果你知道当前登录用户的ID,可以直接通过EF的导航属性链式查询:
// 假设当前登录用户的ID是currentUserId var currentUserId = "你的当前用户ID"; var followerBlogPosts = await _context.Users .Where(u => u.Id == currentUserId) .SelectMany(u => u.Followings) // 获取当前用户关注的所有人 .SelectMany(follower => follower.BlogPosts) // 获取这些关注者的所有博文 .Include(b => b.CreatedBy) // 如果需要返回博文作者的信息,就加上这个 .OrderByDescending(b => b.CreatedAt) // 按发布时间倒序,最新的在前 .ToListAsync();
方式二:用已有的关注者列表查询
如果你已经提前获取到了关注者列表(比如var followers = ...),可以直接提取他们的ID来过滤博文:
// 从已有的关注者列表中提取ID集合 var followerIds = followers.Select(f => f.Id).ToList(); var followerBlogPosts = await _context.BlogPosts .Where(post => followerIds.Contains(post.CreatedById)) .Include(post => post.CreatedBy) .OrderByDescending(post => post.CreatedAt) .ToListAsync();
一些额外建议
- 如果你的REST API需要返回大量博文,记得加上分页,用
Skip(pageSize * (pageIndex - 1))和Take(pageSize)来实现; - 如果不需要返回博文作者的信息,可以去掉
Include(b => b.CreatedBy),能提升查询性能; - 可以根据需求添加过滤条件,比如只返回最近7天的博文,或者包含特定关键词的内容。
内容的提问来源于stack exchange,提问作者itdeeps
相关产品推荐
相关产品推荐

