繁体   English   中英

IQueryable 上的 EF Core “InvalidOperationException:InvalidOperationException: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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM