5

マッピングのために値を検索する必要があるときに、データベースの呼び出しを処理する別の方法はありますか? マッピング ロジック内でデータベース呼び出しを行うのは見苦しく思えます。これは他にどのように処理されますか?

たとえば、テーブルには SEXID が格納されるため、以下のリゾルバーを使用して次のようなことができます

CreateMap<StagingPerson, Person>()
  .ForMember( dest => dest.SEXID, 
     m => m.ResolveUsing<SexLookupResolver>().FromMember( src => src.Gender ) );         

public class SexLookupResolver : ValueResolver<string, int>
{
protected override int ResolveCore( string source )
{
  int id = -1;
  if (source == "Male")
     id = dataAccess.GetGenderByString("M");
  else if(source == "Female")
     id = dataAccess.GetGenderByString("F");
  else if(source == "?")
     id = dataAccess.GetGenderByString("?");
  else
     id = dataAccess.GetGenderByString("?");
  return id;
}
}

データアクセス:

public int GetGenderByString(string gender)
{
  string sql = "select sexid from Sexes where sex = '" + gender "'";
  int sexid = .....
  ......
  return sexid;
}
4

1 に答える 1

0

クラスに別のフィールドを追加して、性別の文字列バージョンを格納することで、これを解決しました。マッピングは文字列にマップするように変更され、SEXID フィールドは無視され、後で DAL 操作中に設定されます。

CreateMap<StagingPerson, Person>()
  .ForMember( dest => dest.SexString, u => u.MapFrom( src => src.Sex) )
  .ForMember( dest => dest.SEXID, u.Ignore() ) );

/// The source class
public class StagingPerson
{
  /// holds "M", "F", "U", "?", etc
  public string Gender {get;set;}
}

/// the destination class
public class Person
{
  public int SEXID {get;set;}

  // New property to store the source string value
  // looked up in the Data Access Layer to determine the sexId
  public string SexString {get;set;}
}
于 2013-10-25T18:23:39.850 に答える