![](/img/trans.png)
[英]EF Core "InvalidOperationException: Include has been used on non entity queryable" for navigation property even after explicit include
[英]EF Core “InvalidOperationException: Include has been used on non entity queryable” on IQueryable
我有以下架构:
public class Post {
public string Id {get;set;}
public string Content {get;set;}
public AppUser AppUser {get;set;}
public List<PostTag> PostTags {get;set;}
}
public class Tag {
public string Id {get;set;}
public string Name {get;set;}
public List<PostTag> PostTags {get;set;}
}
public class PostTag
{
public string PostId { get; set; }
public Post Post { get; set; }
public string TagId { get; set; }
public Tag Tag { get; set; }
}
具有以下数据库关系:
builder.Entity<PostTag>()
.HasKey(x => new { x.PostId, x.TagId });
builder.Entity<PostTag>()
.HasOne(st => st.Post)
.WithMany(s => s.PostTags)
.HasForeignKey(st => st.PostId);
builder.Entity<PostTag>()
.HasOne(st => st.Tag)
.WithMany(s => s.PostTags)
.HasForeignKey(st => st.TagId);
我正在编写一个查询,以根据提供的 TagId 获取链接到特定标签的所有帖子。
首先,我使用以下方式获取所有帖子:
var postsQuery = _ctx.PostTag
.Include(st => st.Post)
.Where(st => st.TagId == {provided TagId})
.Select(st => st.Post);
由于我想在每个帖子中包含一些进一步的数据,所以我这样做:
var postsWithExtraData = postsQuery
.Include(s => s.AppUser)
.Include(s => s.PostTags)
.ThenInclude(st => st.Tag)
.OrderByDescending(s => s.TotalVoteCount)
.ToListAsync();
但是查询在第一个.Include
时中断,并出现此错误:
EF Core “InvalidOperationException: Include has been used on non entity queryable”
为什么会发生这种情况,我该如何解决?
编辑:我开始工作的潜在解决方案:
var posts = _ctx.PostTag
.Include(st => st.Post)
.ThenInclude(s => s.AppUser)
.Include(st => st.Post)
.ThenInclude(s => s.PostTags)
.ThenInclude(st => st.Tag)
.Where(st => st.TagId == request.TagId)
.Select(st => st.Post)
.ToList();
很想知道这是否是一个好方法。
如果您更改查询以使其不再返回查询以 开头的实体类型的实例,则包含运算符将被忽略。
所以你的代码给出了错误。 您可以像下面那样在第一个查询中使用Includes
并在下一个查询中使用OrderByDescending
ToListAsync
。
var postsQuery = _ctx.PostTag
.Include(st => st.Post)
.ThenInclude(s => s.AppUser)
.Include(st => st.Post)
.ThenInclude(s => s.PostTags)
.ThenInclude(st => st.Tag)
.Where(st => st.TagId == {provided TagId})
.Select(st => st.Post);
var postsWithExtraData = postsQuery
.OrderByDescending(s => s.TotalVoteCount)
.ToListAsync();
首先,你应该写Include and ThenInclude
然后写你的Condition
var postsWithExtraData = _ctx.PostTag
.Include(st => st.Post)
.Include(s => s.AppUser)
.Include(s => s.PostTags)
.ThenInclude(st => st.Tag)
.Where(st => st.TagId == {provided TagId})
.OrderByDescending(s => s.TotalVoteCount)
.ToListAsync();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.