我在使用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; }
}
AutomapperConfiguration:
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())
我正在尝试通过ApplyTo方法应用OData过滤器,如下所示:
query.ApplyTo(db.Freight.ProjectTo<FreightDTO>()) as IQueryable<FreightDTO>;
但每当我尝试过滤时:
http://localhost:22564/api/Freights?$ top = 1&amp; $ filter = Services / any(s:contains(s / PrimaryCode,'41156')eq true)
我收到以下错误:
LINQ to不支持指定的类型成员'Services' 实体。仅初始化程序,实体成员和实体导航 支持属性。
根据我的理解,我很想过滤掉未包含在投影中的属性。但我试图避免这种情况包括,因为我不想带所有的Child对象,只需根据它们过滤父对象。
我不想做的事情:
query.ApplyTo(db.Freight.ProjectTo<FreightDTO>(null, "Services")) as IQueryable<FreightDTO>;
由于我正在使用OData的ODataQueryOptions'ApplyTo',我以前无法在传递给Automapper的数据集中应用过滤器(直接过滤实体而不是DTO)。
所以我的问题是:有没有办法根据孩子过滤父对象,而不必将孩子从数据库中带出来?
提前致谢。