C# 通过多个嵌套对象关系使用EF Core进行筛选

C# 通过多个嵌套对象关系使用EF Core进行筛选,c#,entity-framework-core,linq-to-entities,C#,Entity Framework Core,Linq To Entities,我有一个新的要求,根据黑名单的数量过滤查询返回的报告 因此,最初我有一个查询,它返回所有需要的相关信息,并获取与特定用户关联的报告列表 var reports = from r in Context.Reports join ax in Context.AuthorizationXref on r.Id equals ax.ReportId join g in Context.Groups o

我有一个新的要求,根据黑名单的数量过滤查询返回的报告

因此,最初我有一个查询,它返回所有需要的相关信息,并获取与特定用户关联的报告列表

var reports = from r in Context.Reports
                          join ax in Context.AuthorizationXref on r.Id equals ax.ReportId
                          join g in Context.Groups on ax.GroupId equals g.Id
                          join ugx in Context.UsersGroupsXref on g.Id equals ugx.GroupId
                          where ugx.UserId == id
                          select r;
AuthorizationXref具有ReportID和GroupId

public partial class AuthorizationXref
    {
        public int Id { get; set; }
        public int ReportId { get; set; }
        public int GroupId { get; set; }

        public virtual Groups Group { get; set; }
        public virtual Reports Report { get; set; }
    }

public partial class Groups
    {
        public Groups()
        {
            AuthorizationXref = new HashSet<AuthorizationXref>();
            UsersGroupsXref = new HashSet<UsersGroupsXref>();
        }

        public int Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }

        public virtual ICollection<AuthorizationXref> AuthorizationXref { get; set; }
        public virtual ICollection<UsersGroupsXref> UsersGroupsXref { get; set; }
    }
这台机器的速度大约为100ms,但没有对userId进行任何过滤。这些基准都在开发中,随着我们进入越来越多的报告添加到用户的更高环境,这些基准只会变得更糟。我知道使用选择更有效,但我找不到实体上复杂嵌套多对多选择的示例

我可以走到这一步,但不知道在何处放置额外的步骤来深入研究对象

var asdf = repo.Where(x=>x.AuthorizationXref.Any(y=>y.ReportId==x.Id));
最终目标是,我需要一个按用户ID列出的报告列表,以删除在另一个表中按ID显示的报告。所以有一个名为UserReportFilter的表,它有ReportId和UserId,该表中的任何报告都不应该出现在我的最终结果中


作为旁注,如果有人能告诉我如何使用这些表达式,我将不胜感激。我遇到了这样的事情,学习这样的东西似乎是一件很有力量的事情,但是我需要更多的解释。我理解这个概念,并且在查询中使用了基本Func返回,但没有这么广泛。

我假设报表和UserReportFilter表之间存在关系,因为UserReportFilter表中有ReportId。下面的表达应该有用

var reports = context.Reports
    .Include(x => x.AuthorizationXref)
    .ThenInclude(x => x.Group)
    .ThenInclude(x => x.UsersGroupsXref)
    .Include(x => x.UserReportFilters)
    .Where(x => x.AuthorizationXref.Any(y => y.Group.UsersGroupsXref.Any(z => z.UserId==id))
    .ToList();

我假设报表和UserReportFilter表之间有关系,因为UserReportFilter表中有ReportId。下面的表达应该有用

var reports = context.Reports
    .Include(x => x.AuthorizationXref)
    .ThenInclude(x => x.Group)
    .ThenInclude(x => x.UsersGroupsXref)
    .Include(x => x.UserReportFilters)
    .Where(x => x.AuthorizationXref.Any(y => y.Group.UsersGroupsXref.Any(z => z.UserId==id))
    .ToList();

我没有从intellisense中的AuthorizationXref获取组,因为它是一个集合。。。我想我应该说得更清楚。你也可以分享你的AuthorizationXref.cs类吗?你应该能够得到它,如果它是一个集合,我已经添加了其中一个类,而另一个类几乎相同。这是我第一次针对EF和Core进行的重大尝试。拥有大量嵌套集合从来都不是我需要做的事情,存储过程通常是这类事情的目标,但我在这个项目中尝试不使用它。Intellisense可能会出现故障。然后include(),但如果拼写正确,错误应该会消失。AuthorizationXref.cs包含GroupWell似乎是正确的,这大概是最好的方法和过滤器。还有一点关于性能。我以为我已经试过了,但显然没有。它现在给了我正确的计数,运行速度约为75毫秒,这是一个巨大的改进。非常感谢。我只需要核实一下,它给了我正确的65份报告,但似乎它应该。您可能希望将新where合并到后代的答案中。我没有从intellisense中的AuthorizationXref获取组,因为它是一个集合。。。我想我应该说得更清楚。你也可以分享你的AuthorizationXref.cs类吗?你应该能够得到它,如果它是一个集合,我已经添加了其中一个类,而另一个类几乎相同。这是我第一次针对EF和Core进行的重大尝试。拥有大量嵌套集合从来都不是我需要做的事情,存储过程通常是这类事情的目标,但我在这个项目中尝试不使用它。Intellisense可能会出现故障。然后include(),但如果拼写正确,错误应该会消失。AuthorizationXref.cs包含GroupWell似乎是正确的,这大概是最好的方法和过滤器。还有一点关于性能。我以为我已经试过了,但显然没有。它现在给了我正确的计数,运行速度约为75毫秒,这是一个巨大的改进。非常感谢。我只需要核实一下,它给了我正确的65份报告,但似乎它应该。你可能想把这个新的where纳入子孙后代的答案中。