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

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

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

以下是回购协议中的方法,不包括任何与子集合相关的内容(为了清晰起见,我缩短了它):

公共静态IQueryable GetEligibleMeasures(此IRepository存储库,
字符串投影(D)
{
var measures=repository.GetRepository().Queryable();
var projects=repository.GetRepository().Queryable();
//更多存储库。。。
var eligibleMeasures=(从m开始)
在m.projectd等于p.projectd的项目中加入p
//更多连接和where子句
选择m
).Distinct();
返回可消除措施;
}
我需要的是能够返回具有多对多关系的站点集合。我试着把Include放在几个不同的地方(在from中,在distinct之前,在return中),但是什么也没想到。我还尝试通过config取消标准has many,并使用链接表作为实体,然后向查询添加两个连接以访问子集合,并使用include尝试加载它。这些都不管用

有没有人对此有任何经验或建议?如果这有帮助的话,我可以发布部分配置——三大科技产品之间的因素太多了,我不知道一开始应该发布什么


感谢您提供的帮助。

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

然后你的问题就消失了

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;
    }