Entity framework 如何在EF6中表示和过滤相关数据模型

Entity framework 如何在EF6中表示和过滤相关数据模型,entity-framework,.net-core,Entity Framework,.net Core,我一直在努力根据一个简单的数据模型获得所需的输出。有人能帮我看看,让我走上正轨吗 我正在将一个自定义的“基于组的权限”模式建模为一个请购单列表。我有一个表来存储组列表,一个表来存储组的“成员资格”(GroupMembership),还有一个表来存储组对请求(ReqGroups)的权限(读/写)。我甚至尝试了使用.NET framework的数据库优先方法,这就是我生成DB图的方式。当我在.NETCoreAPI项目中使用生成的模型时,这导致了循环引用错误。 我可以通过T-SQL轻松表示所需的输出

我一直在努力根据一个简单的数据模型获得所需的输出。有人能帮我看看,让我走上正轨吗

我正在将一个自定义的“基于组的权限”模式建模为一个请购单列表。我有一个表来存储组列表,一个表来存储组的“成员资格”(GroupMembership),还有一个表来存储组对请求(ReqGroups)的权限(读/写)。我甚至尝试了使用.NET framework的数据库优先方法,这就是我生成DB图的方式。当我在.NETCoreAPI项目中使用生成的模型时,这导致了循环引用错误。

我可以通过T-SQL轻松表示所需的输出:

SELECT r.*, x.Rights FROM Requisition r
INNER JOIN 
(
   SELECT rp.RequisitionID, rp.Rights from ReqGroup rp
   INNER JOIN GroupMembership m on m.GroupID = rp.GroupID
   WHERE m.UserId = @UserId
) x on r.Id = x.RequisitionID
通过多次尝试和错误,我能够通过以下查询从EF获得数据:

_context.Requisition
  .Include("ReqGroups.Group.GroupMemberships")
  .ToListAsync();
但是我需要过滤相关数据(GroupMembership),这在EF Core中似乎是不可能的。我看到的唯一替代方法是反转模型中的关系,这样我就可以根据当前用户过滤GroupMembership用户ID,并包括请购单


提前感谢您的指导

嗯,应该是可能的。比如:

var query = _context.Requisition
    .Where(x => x.ReqGroup
        .Any(rg => rg.Group.GroupMembership.UserId == userId)
    .Select( x => new 
    {
        Requisition = x,
        UserReqGroupRights = x.SelectMany(x => x.ReqGroup
            .Where(rg => rg.Group.GroupMemberShip.UserId == userId)
            .Select(rg => rg.Rights)
            .ToList()
    });
这将返回一个匿名类型,其中包含每个具有用户关联组的请购单,以及该用户适用权限的集合

要将此数据返回到视图等,我建议选择POCO视图模型。EF实体关系本身无法过滤,您可以选择一个申请,并且只能选择与该用户关联的组,但您可以使用
select
过滤该数据