2016-09-14 54 views
0

我有需要了解两天之间差异的情况。我想在mapper conf中这样做。在自动映射器映射(UseValue)中计算日期时间差异

问题是我不知道这是可能的和如何?

下面是示例代码:

CreateMap<Post, ManagePostViewModel>() 
.ForMember(d => d.ActiveInDays, conf => conf.UseValue((DateTime.UtcNow - (conf.CreatedAt)).TotalDays)); 

我测试了这个语法静态值和它的作品。如果我使用conf.CreatedAt它不到风度,给人以下错误:

'IMemberConfigurationExpression' does not contain definition for 'CreatedAt' and no extension method 'CreatedAt' accepting a first argument of type 'IMemberConfigurationExpression' could be found (are you missing a using directive or an assembly reference?)

modelviewModel我已经定义CreatedAt

+0

您键入了'conf.CreatedAt'。这不是你的ViewModel,这是'IMemberConfigurationExpression'对象,它允许你创建一个表达式 –

回答

1

第一个问题是输入错误:您输入conf.CreatedAtconf不是您的ViewModel,那是允许您创建映射表达式的IMemberConfigurationExpression对象。

第二个问题是UseValue仅用于计算一次值,因此它不提供对ViewModel的访问权限。您需要使用MapFrom来计算每个ViewModel的值。

最后的问题是Automapper不应该像那样工作。它应该一个属性到另一个,不产生新的值。计算持续时间的最佳位置是目标ViewModel。这将更容易地更改和测试持续时间计算代码lot

在当前场景中,您应该将CreatedAt映射到ViewModel中的一个类似属性,并添加一个返回DateTime.UtcNow - CreatedAt).TotalDays的只读属性。使用C#6语法,这将是一个简单的

public double ActiveInDays => (DateTime.UtcNow - conf.CreatedAt).TotalDays; 

也许是更好的选择是重返时间戳本身并指定你的数据格式化字符串结合

public double ActiveDuration => DateTime.UtcNow - conf.CreatedAt; 

这将允许你显示日期分数为小时,分钟等

如果来进行计算,而映射,你应该尝试:

.ForMember(model => model.ActiveInDays, 
      conf => conf.MapFrom(
       model => (DateTime.UtcNow - model.CreatedAt).TotalDays 
     )) 

我认为使用只读属性显然更清晰。

更新

如果目的是为了充分展示天,Days属性应被用来代替TotalDays

+0

我使用了你所建议的只读属性,它正在工作。谢谢! – Aaron

+0

是的,关于使用Days属性是真的。我不知道为什么我没有在第一时间使用它...谢谢! – Aaron

0

你可以尝试ResolveUsing方法。 Additional information

public MappingProfiles() 
    { 
     CreateMap<Post, ManagePostViewModel>().ForMember(d => d.ActiveInDays, conf => conf.ResolveUsing(CalculateActiveDays)); 
    } 

    private static object CalculateActiveDays(Post arg) 
    { 
     return (DateTime.UtcNow - arg.CreatedAt).TotalDays; 
    }