我有一个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”?或者以某种方式告诉它映射?
答案 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));