Entity framework OData自动映射项目以明确扩展筛选器子EF

Entity framework OData自动映射项目以明确扩展筛选器子EF,entity-framework,odata,automapper,Entity Framework,Odata,Automapper,我在尝试使用Automapper的ProjectTo使用自定义DTO实现OData时遇到问题 假设我有以下对象: public class Freight { public virtual ICollection<General.Fleet.Service> Services { get; set; } } public class FreightDTO { public virtual ICollection<DTO.General.Fleet.Service&

我在尝试使用Automapper的ProjectTo使用自定义DTO实现OData时遇到问题

假设我有以下对象:

public class Freight
{
   public virtual ICollection<General.Fleet.Service> Services { get; set; }
}

public class FreightDTO
{
   public virtual ICollection<DTO.General.Fleet.Service> Services { get; set; }
}
公共舱货运
{
公共虚拟ICollection服务{get;set;}
}
公舱货物
{
公共虚拟ICollection服务{get;set;}
}
自动映射配置:

cfg.CreateMap<General.Fleet.Freight, DTO.General.Fleet.FreightDTO>()
                    .ForMember(x => x.Services, options => options.ExplicitExpansion())

cfg.CreateMap<DTO.General.Fleet.FreightDTO, General.Fleet.Freight>()
                    .ForMember(x => x.Services, options => options.ExplicitExpansion())
cfg.CreateMap()
.ForMember(x=>x.Services,options=>options.ExplicitExpansion())
cfg.CreateMap()
.ForMember(x=>x.Services,options=>options.ExplicitExpansion())
我试图通过ApplyTo方法应用OData过滤器,如下所示:

query.ApplyTo(db.Freight.ProjectTo<FreightDTO>()) as IQueryable<FreightDTO>;
query.ApplyTo(db.Freight.ProjectTo())作为IQueryable;
但每当我尝试过滤时:

?$top=1&$filter=Services/any(s:contains(s/PrimaryCode,'41156')均衡器true)

我得到以下错误:

LINQ to中不支持指定的类型成员“服务” 实体。仅初始值设定项、实体成员和实体导航 支持属性

据我所知,我无法通过投影中未包含的属性进行过滤。但是我试图避免这种包含,因为我不想带来所有的子对象,只需要根据它们过滤父对象

我不想做的事:

query.ApplyTo(db.Freight.ProjectTo<FreightDTO>(null, "Services")) as IQueryable<FreightDTO>;
query.ApplyTo(db.Freight.ProjectTo(null,“Services”))作为IQueryable;
由于我使用的是OData的ODataQueryOptions'ApplyTo',因此我以前无法在传递给Automapper的数据集中应用过滤器(直接在实体而不是DTO上进行过滤)

所以我的问题是:有没有一种方法可以基于子对象过滤父对象,而不必从数据库中取出子对象


提前谢谢。

这方面运气好吗?我遇到了相同的问题。请检查您是否正在控制器上使用EnableQuery属性。这将在返回后附加Where Linq子句。因此,如果没有包含,则会出现此错误。尝试删除该属性。