web-dev-qa-db-ja.com

AutoMapper 8.0でResolveUsingが見つかりません

AutoMapper 8.0より前では、このコードを使用していました。

CreateMap<ApplicationRole, RoleViewModel>()
.ForMember(d => d.Permissions, map => map.MapFrom(s => s.Claims))
.ForMember(d => d.UsersCount, map => map.ResolveUsing(s => s.Users?.Count ?? 0))
                    .ReverseMap();

ドキュメンテーションには、MapFromのResolveUsingを変更する必要があると書かれていますが、「Propagation Nullなし」というエラーが表示されます

.ForMember(d => d.UsersCount, map => map.MapFrom(s => s.Users?.Count ?? 0))

どうすれば解決できますか?

19
Juan Calderon

ResolveUsingをMapFromで置き換え、ラムダ(TDestination)にもう1つの入力パラメーターを追加します。

.ForMember(d => d.UsersCount, map => map.MapFrom((s,d) => s.Users?.Count ?? 0))
33
Paw Baltzersen

AutoMapper 8.0ではResolveUsingがありません

私も同じ問題を抱えており、次のResolveUsingのプロトタイプを使用しています。

void ResolveUsing(Func<TSource, TResult> mappingFunction);

既存のコードを置き換える代わりに、拡張メソッドを作成することを好みました。

using System;
using AutoMapper;

namespace myLibrary.Extensions
{
    public static class AutoMapperCompatibilityExtensions
    {
        // Summary:
        //     Resolve destination member using a custom value resolver callback. Used instead
        //     of MapFrom when not simply redirecting a source member This method cannot be
        //     used in conjunction with LINQ query projection
        //
        // Parameters:
        //   resolver:
        //     Callback function to resolve against source type
        public static void ResolveUsing<TSource, TDestination, TMember, TResult>(this IMemberConfigurationExpression<TSource, TDestination, TMember> member, Func<TSource, TResult> resolver) => member.MapFrom((Func<TSource, TDestination, TResult>)((src, dest) => resolver(src)));
    }
}

後で、私のコードで、単に名前空間を参照しました。

using myLibrary.Extensions;

...
    ... map.ResolveUsing(s =>  ...
...

お役に立てれば。

12
Marcello R.

この式を使用する必要はありません。「Users.Count」を使用できます。リストが空の場合は0を返します。

1
Ossama Zakaria

ResolveUsing(またはMapFrom)を削除するだけで、UsersCount => UsersCountの規則に従ってマッピングされます。

0