2

私はエンティティを持っています:

[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; }
}

ここで、多対一にRepresentatives関係します。Member親メンバーと一緒にいくつかの代表者を取得し、それをすべていくつかのビューモデルに投影したいと考えています。次のようにオートマッパーを構成しました。

    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
    }
}
...

そのため、何らかの理由でビルダーは Expression を呼び出す代わりに Func を呼び出します。なぜそうなのか、アイデアはありますか?マッパーに正しい式と SQL クエリを作成させるにはどうすればよいですか?

4

0 に答える 0