Automapper Project.To break db IQueryable

时间:2013-04-01 19:51:41

标签: c# linq entity-framework expression automapper

我有实体:

[Table("Representatives")]
public class Representative
{
    [Column("RepID"), Key]
    public int Id { get; set; }
    [Column("MemID")]
    public int MemberId { get; set; }
    public virtual Member Member { get; set; }
}

[Table("Members")]
public class Member
{
    [Column("MemID"), Key]
    public int Id { get; set; }

    [ForeignKey("MemberId")]
    public virtual ICollection<Representative> Representatives { get; set; }
}

其中RepresentativesMember有多少关系。我想要检查一些代表与他们的父成员,并将其全部投射到一些视图模型。我已经像这样配置了automapper:

    Mapper.CreateMap<Representative, RepresentativeViewModel>()
          .ForMember(m => m.RepId, a => a.MapFrom(x => x.Id))
          .ForMember(m => m.MemberModel, a => a.MapFrom(x => x.Member));

    Mapper.CreateMap<Member, MemberViewModel>()
          .ForMember(m => m.MemId, a => a.MapFrom(x => x.Id))
          .ForMember(m => m.OrganizationName, a => a.MapFrom(x => x.Name));

如果我运行此代码:

var prj = ctx.Representatives.Where(r => r.Id == 1).Project().To<RepresentativeViewModel>();

然后我得到包含func调用(调试)的表达式树:

...
.Lambda #Lambda2<System.Func`2[ConsoleApplication1.Representative,ConsoleApplication1.RepresentativeViewModel]>(ConsoleApplication1.Representative $var1)
{
    .New ConsoleApplication1.RepresentativeViewModel(){
        Name = $var1.Name,
        RepId = $var1.Id,
        MemberModel = .Invoke (.Lambda #Lambda3<System.Func`2[ConsoleApplication1.Member,ConsoleApplication1.MemberViewModel]>)($var1.Member)
    }
}
.Lambda #Lambda3<System.Func`2[ConsoleApplication1.Member,ConsoleApplication1.MemberViewModel]>(ConsoleApplication1.Member $var2)
{
    .New ConsoleApplication1.MemberViewModel(){
        MemId = $var2.Id,
        OrganizationName = $var2.Name
    }
}
...

因此,由于某些原因,构建器调用Func而不是调用Expression。你知道为什么会这样吗?如何让我的mapper构建正确的表达式和SQL查询?任何帮助表示赞赏。

谢谢!

0 个答案:

没有答案