2011-11-21 95 views
5

我有一个使用EF创建对象Foo,它有一个导航属性Bar,它是一对多的,但应该是一对一的。无论如何,当我查询Foo时,我还想从Bar集合中获取第一个也是唯一的一个项目,并将这些项目映射到Biz Dto,我将如何去做这件事?如何使用AutoMapper映射集合中的第一个项目

 var result = (from c in ctx.Foo 
        where c.Bar.Any(cs => cs.LOGINNAME == username && cs.PASSWORD == password) 
     select c).First(); 

然后在我的AutoMapper配置中,我会创建一个看起来像?

 Mapper.CreateMap<Foo, Biz>() 
      .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.CLIENTID)) 
      .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Bar.FirstOrDefault???)) 

谢谢 斯蒂芬

+0

你的CreateMap调用看起来正确。他们不适合你吗? – PatrickSteele

+0

@PatrickSteele你确定这是允许的吗? opt.MapFrom(src => src.Bar.FirstOrDefault ???) –

+0

显然,您需要清理语法,但是,您可以在每个字段的基础上定义自定义映射:opt.MapFrom (s => s.Bar.FirstOrDefault()); – PatrickSteele

回答

6

使用FirstOrDefault()Bar集合时,你映射它:

opt.MapFrom(src => src.Bar.FirstOrDefault()) 
0

考虑:

public class Foo{ 
public ICollection<Bar> Bars { get; set; } 
} 

解决方案:

var result = from item in FooCollection 
      select new { FirstBar = item.Bars.FirstOrDefault() }; 

其中FooCollection is IQueryable<Foo>

使用FirstOrDefault使存在的情况下也不例外有没有相关的酒吧

应该这样做,我认为......

HTH

+0

用一个例子更新我的问题。 –

相关问题