我已经尝试过各种各样的东西,但我似乎没有按预期工作。
一些背景故事,我正在使用WebApi创建OData [可查询]端点。我的实体中有DateTime字段,但我需要它们是字符串,或者我的APIModel中的DateTimeOffsets,因为WebAPI目前禁止使用DateTimes。
//Repository call (returns IQueryable<Schedule>):
_ECFRepository.GetScheduleByDateRange(start_date, end_date).Project().To<ScheduleAPIModel>();
设置ProjectUsing会导致我的所有数据恢复单元化:
//Even if set ScheduleAPIModels to a constant value they show up as null
Mapper.CreateMap<Schedule, ScheduleAPIModel>()
.ProjectUsing(p =>
new ScheduleAPIModel()
{
sd_dtset = p.sd_dtset == null ? "" : ((DateTime)p.sd_dtset).ToShortDateString(),
sd_dtsatis = p.sd_dtsatis == null ? "" : ((DateTime)p.sd_dtsatis).ToShortDateString(),
});
Custom type converter似乎也不起作用,我最终得到了这个错误:
Type 'System.String' does not have a default constructor
我也试过使用MapFrom,但是Linq不喜欢内联的ToString()操作,所以这样的东西也不会起作用:
Mapper.CreateMap<Schedule, ScheduleAPIModel>()
.ForMember(dest => dest.sd_dtset, opt => opt.MapFrom(src => ((DateTime)src.sd_dtsatis).ToShortDateString()))
LINQ to Entities does not recognize the method 'System.String ToShortDateString()' method, and this method cannot be translated into a store expression.
我试图将其保持为IQueryable,因为OData的查询在运行时应用,并且使用ODataQueryOptions将要求我公开我的实体。
希望我只是在Project / ProjectUsing中犯了一些简单的错误。
编辑:我能够通过将DateTime字段映射到我在DTO中的DateTime字段来解决这个问题,我在EntitySet中设置为Ignore并暴露在其getter中进行字符串转换的Entity成员。但我希望有一个更优雅的解决方案。