Asp.net core mvc EF核心多对多获取查询

Asp.net core mvc EF核心多对多获取查询,asp.net-core-mvc,entity-framework-core,Asp.net Core Mvc,Entity Framework Core,我建立了以下多对多关系模型 公共类配置文件 { ICollection类别{get;set;} //一对多 ICollection平台{get;set;} } 公共类类别 { ICollection配置文件{get;set;} } 公共类档案类别 { 公共int ProfileId{get;set;} 公共配置文件{get;set;} public int CategoryId{get;set;} 公共类别{get;set;} } 我使用的是ASP.NET核心MVC,有一个过滤器视图模型,其中

我建立了以下多对多关系模型

公共类配置文件
{
ICollection类别{get;set;}
//一对多
ICollection平台{get;set;}
}
公共类类别
{
ICollection配置文件{get;set;}
}
公共类档案类别
{
公共int ProfileId{get;set;}
公共配置文件{get;set;}
public int CategoryId{get;set;}
公共类别{get;set;}
}
我使用的是ASP.NET核心MVC,有一个过滤器视图模型,其中在概要文件名的某些属性上有一个过滤器,它可以工作

事实证明,尝试基于类别进行过滤要困难得多(至少解决方案对我来说并不明显:)

用户可以从web上选择零个、一个或多个类别进行过滤,因此基本上发送给我的控制器的是类别ID列表

IQueryable查询=\u context.Profiles.Include(p=>p.Categories).Include(p=>p.Platforms);
if(string.IsNullOrEmpty(search.Name))
{
query=query.Where(p=>p.Name.IndexOf(search.Name StringComparison.OrdinalIgnoreCase)>0);
}
if(search.Categories?.Any()!=null)
{
query=query.SelectMany(p=>p.ProfileCategories)
.Join(search.Categories,pc=>pc.categoriid,cId=>cId,(pc,)=>pc.Profile);
}
从这一点来看,Profile对象是不同的,其他导航属性(如平台)是空的,因此会破坏其他部分


如何在保留纵断面对象的原始实例的同时执行连接。我最初认为它们是一样的,但我错了。

目前,EF Core连接并不完美,我建议进行两个查询:

1) 选择ProfileId的列表(基于类别列表):

2) 根据已知ID选择所需数据:

var result = await _context.Profiles
    .Include(p => p.Categories).Include(p => p.Platforms)
    .Where(x => profileIds.Contains(x.ProfileId))
    .ToListAsync();

是的,这是两个查询,而不是一个,但是两个简单的查询,可以使用索引轻松优化。

几乎就是我采用的方法:)谢谢您的快速回答!
var result = await _context.Profiles
    .Include(p => p.Categories).Include(p => p.Platforms)
    .Where(x => profileIds.Contains(x.ProfileId))
    .ToListAsync();