2016-09-14 62 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; 
    }