OData Automapper ProjectTo ExplicitExpansion Filter子EF

时间:2017-10-11 20:09:56

标签: 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> 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)。

所以我的问题是:有没有办法根据孩子过滤父对象,而不必将孩子从数据库中带出来?

提前致谢。

0 个答案:

没有答案