2

description属性を取得するenum拡張メソッドを次に示します。ここで照会可能な投影中にAutoMapperを使用してintをenum記述にマップする方法はありますか?

public static string GetDescription(this Enum enumeration) 
{ 
    if (enumeration == null) 
     throw new ArgumentNullException(); 

    var value = enumeration.ToString(); 
    var type = enumeration.GetType(); 
    var descriptionAttribute = 
     (DescriptionAttribute[]) type.GetField(value).GetCustomAttributes(typeof (DescriptionAttribute), false); 

    return descriptionAttribute.Length > 0 ? descriptionAttribute[0].Description : value; 
} 

は、ソースオブジェクトである:ここで

public class Account { 
    public int AccountId {get;set;} 
    public int AccountStatusId {get;set;} 
} 

は列挙型である:ここでは

public enum AccountStatus { 
    [Description("N/A")] 
    None, 
    [Description("OPEN")] 
    Open, 
    [Description("CLOSED")] 
    Closed, 
    [Description("BAD CREDIT") 
    Problem 
} 

は、宛先オブジェクトである:ここで

public class GetAccountResponse { 
    public int AccountId {get;set;} 
    public string Status {get;set;} 
} 

はに私の試みです地図(最新の非静的なオートアプリを使用) rバージョン)。これはEFの照会可能なプロジェクション中のものであることを覚ここで

_config = new MapperConfiguration(cfg => cfg.CreateMap<Account, GetAccountsResponse>() 
    .ForMember(dest => dest.Status, 
     opts => opts.MapFrom(src => ((AccountStatus) src.AccountStatusId).GetDescription()))); 

は、クエリがIQueryable<Account>で投影である:

query.ProjectToList<GetAccountResponse>(_config); 

これは私が得る例外です:

は、Expression

答えて

1
を照会可能するために、これを解決できません。

MapFromメソッドのシグネチャをチェックアウトすると、オーバーロードの1つがタイプExpression<Func<TSource, TMember>>のパラメータを受け取ることに注意してください。

これは、列挙型の可能な値を適切な文字列に変換できる3項式から式ツリーを構築するメソッドを書くことができることを示しています。 AutoMapperはこれをLINQ経由で適切なSQL式に変換します。ここで

だけ列挙名そのものを使用する例です:次のように

public static class EnumerableExpressionHelper 
{ 
    public static Expression<Func<TSource, String>> CreateEnumToStringExpression<TSource, TMember>(
     Expression<Func<TSource, TMember>> memberAccess, string defaultValue = "") 
    { 
     var type = typeof(TMember); 
     if (!type.IsEnum) 
     { 
      throw new InvalidOperationException("TMember must be an Enum type"); 
     } 

     var enumNames = Enum.GetNames(type); 
     var enumValues = (TMember[])Enum.GetValues(type); 

     var inner = (Expression)Expression.Constant(defaultValue); 

     var parameter = memberAccess.Parameters[0]; 

     for (int i = 0; i < enumValues.Length; i++) 
     { 
      inner = Expression.Condition(
      Expression.Equal(memberAccess.Body, Expression.Constant(enumValues[i])), 
      Expression.Constant(enumNames[i]), 
      inner); 
     } 

     var expression = Expression.Lambda<Func<TSource,String>>(inner, parameter); 

     return expression; 
    } 
} 

あなたはそれを使用します:あなたがあなたの記述を使用するように素直にそれを適応させることができるはず

CreateMap<Entry, EntryListItem>() 
      .ForMember(e => e.ReviewStatus, 
       c => c.MapFrom(EnumerableExpressionHelper.CreateEnumToStringExpression((Entry e) => e.ReviewStatus))) 
関連する問題