Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.8k views
in Technique[技术] by (71.8m points)

c# - Automapper Mapping Multiple Properties to Single Property

I am need help mapping my Domain Object to a ViewModel for use with my C#/MVC App

In the FormAnswer Class there can only be 1 Answer Type (AnswerCurrency, AnswerDateTime, AnswerBool,etc) this is enforced in the Database and Application Logic.

If a Answer exists it will needs to be to Mapped to the Answer Property in the FormAnswerModel if all values are null the Answer is a Empty String.

public class FormQuestion
{
   public int Id {get; set;)
   public string DataType {get; set;} 
   public string Question {get; set;} 
}

public class FormAnswer
{
   public int Id {get; set;)
   public int QuestionId {get; set;)
   public double? AnswerCurrency {get;set}
   public dateTime? AnswerDataTime {get;set}
   public bool? AnswerBool {get;set}
   public string AnswerString{get;set}
   public string AnswerText{get;set}
}

public class FormAnswerModel
{
   public int Id {get; set;)
   public int QuestionId {get; set;)
   public string Answer{get;set}
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

ValueResolver is a good suggestion, especially if you have this pattern elsewhere. If you're looking for a quick and dirty version (that is, if this is the only place you need to handle this sort of situation), try this:

Mapper.CreateMap<FormAnswer, FormAnswerModel>()
    .ForMember(d => d.Answer, o => o.ResolveUsing(fa =>
        {
            string answer = String.Empty;
            if (fa.AnswerBool.HasValue)
            {
                return fa.AnswerBool.Value;
            }

            if(fa.AnswerCurrency.HasValue)
            {
                return fa.AnswerCurrency.Value;
            }

            if(fa.AnswerDateTime.HasValue)
            {
                return fa.AnswerDateTime;
            }

            if(!String.IsNullOrEmpty(fa.AnswerString))
            {
                return fa.AnswerString;
            }

            return answer;
        }
    ));

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...