扩展表达式树

时间:2013-04-01 02:43:56

标签: c# linq entity-framework lambda expression

我是表达树的新手,不知道如何实现以下内容。将感谢任何想法或链接。

我有2个实体需要映射到相应的视图模型。我希望mappers是独立的表达式,可以在我的应用程序的variuos部分重用。

此映射器表达式用于将MainEntity转换为MainEntityViewModel:

public static Expression<Func<MainEntity, MainEntityViewModel>> MainMapper =
    me => new MainEntityViewModel()
        {
            Property1 = me.Property1, // direct mapping
            OtherEntityModel = new OtherEntityViewModel() // here i'd like to use outer expression
                {
                    Name = me.OtherEntityObject.Name,
                    Description = me.OtherEntityObject.Description
                }
        };

我也希望我的OtherEntity是一个单独的表达式:

public static Expression<Func<OtherEntity, OtherEntityViewModel>> OtherMapper =
    oe => new OtherEntityViewModel()
        {
            Name = oe.Name,
            Description = oe.Description
        };

但我不知道如何在第一个映射器中应用它。我想我需要以某种方式扩展第一棵树(添加表达式节点或其他),但不知道该做什么 谢谢!
PS:我知道AutoMapper等,但想使用手动映射。

1 个答案:

答案 0 :(得分:0)

试试这个:

public static Func<MainEntity, OtherEntity, Func<OtherEntity, OtherEntityViewModel>, MainEntityViewModel> 
                MainMapper = me, oe, oMapper  => new MainEntityViewModel()
                                                    {
                                                        Property1 = me.Property1, // direct mapping
                                                        OtherEntityModel = oMapper.Invoke(oe)
                                                    };


public static Func<OtherEntity, OtherEntityViewModel> 
                OtherMapper = oe => new OtherEntityViewModel()
                                        {
                                            Name = oe.Name,
                                            Description = oe.Description
                                        };

我不太确定你为什么需要使用Expression,但如果你想要

你可以把它放回去