如何从集合中映射? Automapper

时间:2011-02-23 21:49:08

标签: asp.net-mvc automapper

我有一个linq to sql对象,它有一些对其他表的引用

我正在尝试将其映射到虚拟机,但没有任何东西可以捕获。

Mapper.CreateMap<A, G>();


// A is the linq to sql object
A.MyList // this is a collection that I am trying to get the value out of A.MyList.Id

// G is my View Model
public class G
{
   public string AMyListId {get; set;}

}


 vm = Mapper.Map<List<A>, List<G>>(aListOfAFromDb);

这总是从null返回。我想我必须手动完成,所以我试过

Mapper.CreateMap<A, G>().ForMember(dest => dest.AMyList , opt => opt.MapFrom(src =>????));

但由于我从列表中获取它,因此不会给出任何可供选择的属性。

修改

我意识到我不应该有一个“MyList”列表,它应该是一对一的。我仍然在尝试做我想做的事情时遇到了问题。

我有这个

Mapper.CreateMap();

A.Vip.UserId // again my linq object is A

// G is my View Model
public class G
{
   public string IsVip {get; set;}

}


 vm = Mapper.Map<List<A>, List<G>>(aListOfAFromDb);

 Mapper.CreateMap<A, G>().ForMember(dest => dest.IsVip, opt => opt.AddFormatter<VipFormatter>());


public class VipFormatter : IValueFormatter
    {
        public string FormatValue(ResolutionContext context)
        {
            bool value = (bool)context.SourceValue;

            if (value)
            {
                return "Yes";
            }


            return "No";

        }
    }

然而没有任何事情受到束缚。我不知道为什么。我是否必须将我的属性更改为“AVipUserId”?或者以某种方式告诉它映射?

2 个答案:

答案 0 :(得分:3)

从我在您的代码中看到的内容,除了上面的评论之外,您还不需要AutoMapper:

List<A> dbItems;
IEnumerable<G> results = dbItems.Select(x => x.MyList.MyListID);

实际上,你不能将A映射到G,因为你要为每个“A”对象创建多个“G”对象。

如果我在这里误解了这个问题,请告诉我。

<强>更新

我会更改“G”以使用布尔属性,然后执行以下操作:

Mapper.CreateMap<A, G>().ForMember(dest => dest.IsVip, opt => opt.MapFrom(src => src.Vip == null));

或者,无论您使用什么逻辑来判断它是否是VIP。

答案 1 :(得分:2)

怎么样:

List<G> items = // whatever
var result = items.Select(g => Mapper.Map<G, A>(g));