2016-09-14 8 views
0

日にちの違いを知る必要がある状況があります。 mapper confでこれをやりたいオートマッパマッピング(UseValue)でdatetimeの差を計算する

問題は、私はこの可能性があり、どのように知っているのですか?ここで

はサンプルコードです:

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

私は静的な値でこの構文をテストし、それが動作します。私はそれがdosn't 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?)

modelではとviewModel私はCreatedAtを定義しています。

+0

「conf.CreatedAt'」と入力しました。これはあなたのViewModelではありません。式を作成できるIMemberConfigurationExpressionオブジェクトです。 –

答えて

1

最初の問題は、タイプミスです。タイプ:conf.CreatedAtです。 confはあなたのViewModelではありません。IMemberConfigurationExpressionオブジェクトで、マッピング式を作成できます。

第2の問題は、値を1回計算するためにUseValueが使用されるため、ViewModelへのアクセスを提供しないことです。個々のViewModelの値を計算するには、MapFromを使用する必要があります。

最後の問題は、Automapperがそのように動作するはずではないということです。 マップ別のプロパティに新しい値を生成しないでください。期間を計算する最も良い場所はターゲットViewModelです。これにより、継続時間計算コードlotの変更とテストが容易になります。

現在のシナリオでは、CreatedAtをViewModelの同様のプロパティにマップし、DateTime.UtcNow - CreatedAt).TotalDaysを返す読み取り専用プロパティを追加する必要があります。これは単純な

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

だろうC#6構文を使用すると、おそらく、より良いオプションは、タイムスタンプ自体を返し、これはあなたが日付を表示することができます

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; 
    }