4

現在、C# MVC プロジェクトで AutoMapper を使用していますが、整数から文字列への変換で問題が発生しました。

私は2つのクラスを持っています:

public class Job
{
    public string Prefix { get; set; }
    public int JobNumber { get; set; }
    public int Year { get; set }
    public int JobPriority { get; set; }

    public virtual EntityPriority EntityPriority { get; set; }
}

public class JobViewModel
{
    public string JobNumberFull { get; set; }
{

Automapper を使用して、Job クラスの 3 つのプロパティすべてを結合して文字列を形成し、JobViewModel クラスの JobNumberFull にマップします。

プレフィックス-ジョブ番号-年

開始するには、物事を単純に保ち、フィールドを文字列に連結しませんでした。次のように、JobNumber (int) を取り、それを JobNumberFull (string) にマップしようとしました。

Mapper.CreateMap<int, string>().ConvertUsing(Convert.ToString);
Mapper.CreateMap<Job, JobViewModel>()
    .ForMember(d => d.JobPriorityId, opt => opt.MapFrom(s => s.EntityPriority.EntityPriorityID))
    .ForMember(d => d.JobPriorityLevel, opt => opt.MapFrom(s => s.EntityPriority.PriorityLevel))
    .ForMember(d => d.JobNumberFull, opt => opt.MapFrom(s => s.JobNumberYear));
Mapper.AssertConfigurationIsValid();

var jobsList = db.Jobs.Where(j => j.OperationID == operationId).Project().To<JobViewModel>().ToList();

これを実行すると、次のエラーが表示されます

Type 'System.String' does not have a default constructor

私はこれが関係していることを知っています

Convert.ToString

しかし、私はそれについて何をすべきかわからない! 文字列から int に変換するときに Convert.ToInt32 を実行できます。これは扱いのように機能します。カスタム型コンバーターを作成する必要がありますか?

文字列 prefix-jobnumber-year を取得するにはどうすればよいですか?

すべての助けに感謝します。


アップデート

Jeremy と AutoMapper Web サイトの助けのおかげで、ここでこれを機能させることができたのが私の解決策です。よりエレガントな解決策があると思われる場合は、お気軽にコメントしてください。

public class Job 
{
    public string Prefix { get; set; }
    public int JobNumber { get; set; }
    public int Year { get; set; }
    public int JobPriority { get; set; }

    public virtual EntityPriority EntityPriority { get; set; }
}

public class JobViewModel 
{
    public int JobNumber { get; set; }
    public int Year { get; set; }
    public string JobNumberFull { get; set; }
}

public enum EntityPriority 
{
  Normal = 0,
  High
}

public interface IValueResolver
{
   ResolutionResult Resolve(ResolutionResult source);
}

public class JobNumberConverter : ValueResolver<Job, string>
{
    protected override string ResolveCore(Job source)
    {
        return string.Format("{0}-{1}-{2}", source.Prefix, source.JobNumber, source.Year);
    }
}

public ActionResult Index()
{
    Mapper.CreateMap<Job, JobViewModel>()
        .ForMember(jvm => jvm.JobNumberFull, opt => opt.ResolveUsing<JobNumberConverter>());
    Mapper.AssertConfigurationIsValid();

    List<Job> jobs = new List<Job>();

    Job j = new Job()
    {
        JobNumber = 1,
        Prefix = "prefix",
        Year = 2013,
        EntityPriority = EntityPriority.High,
        JobPriority = 2
    };

    Job j2 = new Job()
    {
        JobNumber = 2,
        Prefix = "prefix",
        Year = 2013,
        EntityPriority = EntityPriority.High,
        JobPriority = 2
    };

    Job j3 = new Job()
    {
        JobNumber = 3,
        Prefix = "prefix",
        Year = 2013,
        EntityPriority = EntityPriority.High,
        JobPriority = 2
    };

    jobs.Add(j);
    jobs.Add(j2);
    jobs.Add(j3);

    var jobViewModels = jobs.Select(job => Mapper.Map<JobViewModel>(job));

    return View();

}
4

2 に答える 2

0

Job から JobViewModel への変換にはカスタム変換関数を指定する必要があります。

Mapper.CreateMap<Job, JobViewModel>().ConvertUsing(
  job => new JobViewModel {
    JobNumberFull = string.Format("{0}-{1}-{2}",
                      job.Prefix, job.JobNumber, Job.Year)
  });

Job を JobViewModel に変換するには、Map 関数を使用します。

var jobViewModel = Mapper.Map<JobViewModel>(job);

ジョブのリストを JobViewModel に変換するには、Select拡張メソッドを使用します。

var jobViewModels = jobs.Select(job => Mapper.Map<JobViewModel>(job));
于 2013-09-11T17:12:37.250 に答える