5

私には2つのエンティティがあります:EmployeeTeam

代替テキスト

私が欲しいのはのEmployeeFormを持っていることNameですTeam

代替テキスト

AutoMapperを使用してこれを実現するにはどうすればよいですか?

私の現在の「解決策」は次のとおりです。

Mapper.CreateMap<Employee, EmployeeForm>()
                           .ForMember(dest => dest.TeamName, opt => opt.MapFrom(x => x.GetTeams().FirstOrDefault() != null ? string.Join(", ", x.GetTeams().Select(y=>y.Name)) : "n/a"));

私の意見では、これは読みにくいです。

私が欲しいのは、エンティティを渡し、コレクションを選択し、コレクションがnullの場合はデフォルト値を返すか、ラムダ式を介してコレクションのプロパティを選択できるジェネリックメソッドです。

4

2 に答える 2

2

ドメインモデルを変更し始めて、デザイン全体を再考しました。

代替テキスト

リレーションテーブルを使用しmany-to-many associationて2つに変更しました。one-to-many associations

このより簡単なドメインモデルを使用すると、 AutoMapperを使用してこれをフラットなDTOに簡単にマッピングできます。

public class TeamEmployeeMapperProfile : Profile
{
    protected override void Configure()
    {
        CreateMap<TeamEmployee, TeamEmployeeForm>();
    }
}

はい、それだけです:)

これがフラットビューモデルオブジェクトです。

代替テキスト

于 2010-09-13T21:43:59.793 に答える
1

Employeeに「TeamNames」という読み取り専用の文字列プロパティを作成できます。そこにリスト作成ロジックを配置します。そうすることで、テスト可能なプロパティ(ラムダ式と比較して)が得られ、マッピングが容易になります。

于 2010-09-13T12:30:35.890 に答える