You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:27:36