在LINQ查询中包含多对多EF子关系

本文关键字:EF 关系 包含多 LINQ 查询 | 更新日期: 2023-09-27 18:00:34

我正在开发一个使用EF6、AutoMapper和Odata的API。我们有一个调用,它在存储库中使用自定义Linq查询,而不是依赖于约定,但我们需要添加一个具有多对多关系的子集合。我以前在EF中设置过多对多(将HasMany…WithTable添加到模型的配置中,将集合添加到数据和视图模型中,并相应地进行映射),在这种情况下也执行了相同的步骤。然而,我能得到的最接近所需行为的东西是使用Odata的$expand功能获得一个空白的子对象(这是正确的对象,但为空)。这向我表明,从OData和Automapper的角度来看,配置是正确的,但对于EF则不然。

以下是在没有任何与子集合相关的情况下回购中的方法(为了清晰起见,我缩短了它):

public static IQueryable<Measure> GetEligibleMeasures(this IRepository<Measure> repository,
        string projectId)
    {
      var measures = repository.GetRepository<Measure>().Queryable();
      var projects = repository.GetRepository<PROJECT>().Queryable();
      //More Repositories...
      var eligibleMeasures = (from m in measures
                              join p in projects on m.PROJECTID equals p.PROJECTID
                              //more joins and where clauses
                              select m
                              ).Distinct();
      return eligibleMeasures;
    }

我需要的是能够返回与Measures具有多对多关系的Sites集合。我试过在几个不同的地方(在from、在distinct之前和在return中)加入Include,但一无所获。我还尝试过废除标准的has many through config,并使用链接表作为实体,然后向查询添加两个联接以访问子集合,并使用include尝试加载它。这些都不起作用。

有人对此有任何经验或建议吗?如果有帮助的话,我可以发布配置的部分内容——三大技术部分之间有太多因素,我不确定最初应该发布什么。

谢谢你能提供的任何帮助。

在LINQ查询中包含多对多EF子关系

不要在ORM中进行多对多映射,显式映射联接表:

https://lostechies.com/jimmybogard/2014/03/12/avoid-many-to-many-mappings-in-orms/

然后你的问题就消失了。