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

时间:2015-06-30 00:01:44

标签: c# linq entity-framework odata automapper

我正在开发使用EF 6,AutoMapper和Odata的API。我们有一个在存储库中使用自定义Linq查询而不是依赖约定的调用,但是我们需要添加一个具有多对多关系的子集合。我之前在EF中设置了多对多(将HasMany ... WithTable添加到模型的配置中,将集合添加到数据并查看模型,相应地进行映射)并在这种情况下执行相同的步骤。但是,我能够达到理想行为的最接近的事情是使用Odata的$ expand特征获取一个空白子对象(它是正确的对象,但是为空)。这表明从OData和Automapper的角度来看配置是正确的,而不是EF。

以下是repo中的方法看起来没有包含任何与子集合相关的内容(为了清楚起见,我将其缩短):

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集合。我已经尝试过将Include放在那里的几个不同的地方(从中,在不同之前,以及在回归中)但是什么都没有。我还尝试废弃标准的has-many-through配置并使用链接表作为实体,然后在查询中添加两个连接以获取子集合并使用include来尝试加载它。这些都不起作用。

有没有人对此有任何经验或建议怎么做?如果有帮助的话,我可以发布部分配置 - 这三个大型技术部件之间有很多因素,我不知道最初要发布什么。

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

不要在您的ORM中进行多对多映射,明确地映射连接表:

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

然后你的问题就消失了。