如何在使用IQueryable和Project()时将DateTime转换为String。到<>()

时间:2015-02-06 20:11:38

标签: c# linq automapper projection iqueryable

我已经尝试过各种各样的东西,但我似乎没有按预期工作。

一些背景故事,我正在使用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成员。但我希望有一个更优雅的解决方案。

0 个答案:

没有答案