【问题标题】:Auto Mapper : how to map ExpressionsAutomapper:如何映射表达式
【发布时间】:2015-12-22 23:57:50
【问题描述】:
 public IEnumerable<CustomBo> FindBy(Expression<Func<CustomBo, bool>> predicate)
    {
        Mapper.CreateMap<Expression<Func<CustomBo, bool>>, Expression<Func<Entity, bool>>>();

        var newPredicate = Mapper.Map<Expression<Func<Entity, bool>>>(predicate);

        IQueryable<Entity> query = dbSet.Where(newPredicate);

        Mapper.CreateMap<Entity,CustomBo>();

        var searchResult = Mapper.Map<List<CustomBo>>(query);

        return searchResult;
    }

我想将 customBo 类型映射到实体类型..

这里 customBo 是我的模型,Entity 是来自 edmx 的数据库实体。

我正在使用 AutoMapper。

我收到以下错误

找不到从目标类型 Data.Customer 到源类型 Model.CustomerBO 的类型映射。使用 CreateMap 创建从源类型到目标类型的映射。 找不到从目标类型 Data.Customer 到源类型 Model.CustomerBO 的类型映射。使用 CreateMap 创建从源类型到目标类型的映射。

任何建议我在这里的任务..

谢谢

【问题讨论】:

    标签: asp.net-mvc-5 automapper


    【解决方案1】:

    我找到了解决办法。我创建了自定义方法来映射表达式。

    public static class MappingHelper
    {
        public static Expression<Func<TTo, bool>> ConvertExpression<TFrom, TTo>(this Expression<Func<TFrom, bool>> expr)
        {
            Dictionary<Expression, Expression> substitutues = new Dictionary<Expression, Expression>();
            var oldParam = expr.Parameters[0];
            var newParam = Expression.Parameter(typeof(TTo), oldParam.Name);
            substitutues.Add(oldParam, newParam);
            Expression body = ConvertNode(expr.Body, substitutues);
            return Expression.Lambda<Func<TTo, bool>>(body, newParam);
        }
    
        static Expression ConvertNode(Expression node, IDictionary<Expression, Expression> subst)
        {
            if (node == null) return null;
            if (subst.ContainsKey(node)) return subst[node];
    
            switch (node.NodeType)
            {
                case ExpressionType.Constant:
                    return node;
                case ExpressionType.MemberAccess:
                    {
                        var me = (MemberExpression)node;
                        var newNode = ConvertNode(me.Expression, subst);
    
                        MemberInfo info = null;
                        foreach (MemberInfo mi in newNode.Type.GetMembers())
                        {
                            if (mi.MemberType == MemberTypes.Property)
                            {
                                if (mi.Name.ToLower().Contains(me.Member.Name.ToLower()))
                                {
                                    info = mi;
                                    break;
                                }
                            }
                        }
                        return Expression.MakeMemberAccess(newNode, info);
                    }
                case ExpressionType.AndAlso:
                case ExpressionType.OrElse:
                case ExpressionType.LessThan:
                case ExpressionType.LessThanOrEqual:
                case ExpressionType.GreaterThan:
                case ExpressionType.GreaterThanOrEqual:
                case ExpressionType.Equal: /* will probably work for a range of common binary-expressions */
                    {
                        var be = (BinaryExpression)node;
                        return Expression.MakeBinary(be.NodeType, ConvertNode(be.Left, subst), ConvertNode(be.Right, subst), be.IsLiftedToNull, be.Method);
                    }
    
                default:
                    throw new NotSupportedException(node.NodeType.ToString());
            }
        }
    }
    

    现在我这样称呼它

    public CustomBo FindBy(Expression<Func<CustomBo, bool>> predicateId)
        {
            var newPredicate = predicateId.ConvertExpression<CustomBo, Entity>();
        }
    

    如果有人知道如何通过 automapper 进行操作,请告诉我。

    谢谢

    【讨论】:

      【解决方案2】:

      看起来这是在您提出问题后添加的:Expression Translation (UseAsDataSource)

      现在您所要做的就是dbSet.UseAsDataSource().For&lt;CustomBo&gt;().Where(expression).ToList();。好多了!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-04
        • 2013-05-09
        • 2011-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多