【发布时间】:2020-03-04 22:32:05
【问题描述】:
这是我的情况。我有帖子和评论。当我进行查询以获取帖子时,我会这样写:
var queryable = _dataContext.Post
.Where(x => x.DateCreated <= initialDateOfPageLoad)
.AsQueryable();
var posts = await queryable
.Include(p => p.User)
.Include(c => c.Comments) // ***
.Include(l => l.Likes)
.OrderByDescending(p => p.DateCreated)
.ToListAsync();
现在 cmets 实体有一个急切加载的用户。
public class Comment
{
public int Id { get; set; }
public int PostId { get; set; }
public Post Post { get; set; }
public Guid UserId { get; set; }
public User User { get; set; } // ***
public string Body { get; set; }
public bool Modified { get; set; }
public DateTime DateCreated { get; set; }
public DateTime? DateModified { get; set; }
}
每当我收到我的帖子时,我都会像这样将 cmets 映射到一个 dto 中:
public class CommentDto
{
public int Id { get; set; }
public string Body { get; set; }
public DateTime DateCreated { get; set; }
public Guid UserId { get; set; }
public int PostId { get; set; }
public string DisplayName { get; set; } // ***
public string ImagePath { get; set; } // ***
}
因此,我需要应该急切加载评论的用户来插入用户实体上可用的 UserId 和 ImagePath。
现在奇怪的是,评论的用户只有在该用户发表帖子时才会急切地加载...
如果我尝试对尚未发帖的用户发表评论,我将得到空值,并且当我调试时它显示该用户未加载。但是,一旦该用户发表了一篇文章(与该用户发表的文章无关),那么所有内容都会立即正确加载评论。
有人可以解释一下这里发生了什么吗?我不希望每个用户都发表帖子,但我希望他们发表评论。为什么急切加载在这种情况下不起作用?
【问题讨论】:
-
您不会急切地为 cmets 加载用户,但如果他们发布了帖子,那么它会自动为您修复。
.Include(p=>p.Comments.Select(c=>c.User)) -
@RobertMcKee 我收到错误 Lambda 表达式在 Include 中使用无效。当我添加它时,它甚至不会完成请求。
-
对不起,试试
.Include(p=>p.Comments.User),因为它是0:1的关系。语法是一对多。如果这不起作用,请使用.Include(p=>p.Comments).ThenInclude(c=>c.User) -
@RobertMcKee 我按照 .Include(p => p.Comments).ThenInclude(c => c.User) 让它工作了。 .Include(p=>p.Comments.User) 通过一个错误。也许它在 ef 核心上有所不同?