【问题标题】:Automapper mapping function自动映射器映射功能
【发布时间】:2017-05-25 20:33:16
【问题描述】:

大家好,我试图在 Automapper 中实现一些相对简单的东西,但我一直失败。 我正在尝试使用函数表达式在我的 Dto 上映射一个属性

   .ForMember(dest => dest.HasPaid, opt => opt.MapFrom(c => MapHasPaid(c)))

    private bool MapHasPaid(AppUser src)
    {
        var lastPayment = src.RentPayments.OrderByDescending(p => p.DateTo).FirstOrDefault();
        if (lastPayment == null)
        {
            return false;
        }

        return lastPayment.DateFrom.Date <= DateTime.Now.Date &&
               DateTime.Now.Date <= lastPayment.DateTo.Date;
    }

返回

LINQ to Entities 无法识别方法 'Boolean MapHasPaid(xxxx.Models.AppUser)' 方法,并且该方法无法转换为商店表达式。

我尝试使用 IValueResolver

public class CustomResolver : IValueResolver<AppUser, HouseMateEntity, bool>
{
    public bool Resolve(AppUser source, HouseMateEntity destination, bool member, ResolutionContext context)
    {
        var lastPayment = source.RentPayments.OrderByDescending(p => p.DateTo).FirstOrDefault();
        if (lastPayment == null)
        {
            return false;
        }

        return lastPayment.DateFrom.Date <= DateTime.Now.Date &&
               DateTime.Now.Date <= lastPayment.DateTo.Date;
    }
}


.ForMember(dest => dest.HasPaid, opt => opt.ResolveUsing<CustomResolver>())

但给我以下例外

无法将其解析为可查询表达式

如何根据更复杂的查询映射我的属性?

谢谢

我也尝试过文档中的简单案例 https://github.com/AutoMapper/AutoMapper/wiki/Custom-value-resolvers

同样的错误异常

无法将其解析为可查询表达式

有没有人让 ResolveUsing 工作?这是一个自动映射错误吗?

编辑: 我能让这个工作的唯一方法是使用以下方法,它对我来说真的很难闻

.ForMember(dest => dest.HasPaid,
                   opt => opt.MapFrom(c => DbFunctions.TruncateTime(c.RentPayments.OrderByDescending(p => p.DateTo).FirstOrDefault().DateFrom) <= DbFunctions.TruncateTime(DateTime.Now) &&
                                      DbFunctions.TruncateTime(DateTime.Now) <= DbFunctions.TruncateTime(c.RentPayments.OrderByDescending(p => p.DateTo).FirstOrDefault().DateTo)));

【问题讨论】:

    标签: automapper


    【解决方案1】:

    我希望您尝试将其与 AutoMapper 的投影一起使用?问题是您尝试实现的 Resolve 函数正在发出在 LINQ to Entities 中不可翻译的调用。基本上,LINQ 在您对要在数据库上运行的某些相应 SQL 进行的 C# 调用之一之间没有映射。

    最后一点代码起作用的原因是因为您使用了DbFunctions 类,该类实现了所有必要的逻辑来处理 LINQ to Entities 或 LINQ to SQL 中的日期时间操作。

    要么完全像您一样使用DbFunctions 方法,要么首先检索数据(在查询中调用.ToList() 或类似方法),然后映射到您的目标类型。

    这在AutoMapper documentation 中有记录。

    编辑:

    如果您使用 AutoMapper 可查询扩展,则不支持 ResolveUsing AutoMapper documentation: Supported mapping options

    【讨论】:

    • 如果在我的 CustomResolver 中我将 Resolve 方法的整个主体替换为“return true”,它仍然会抛出“Can't resolve this to Queryable Expression”。正如我在帖子中所说,我在github.com/AutoMapper/AutoMapper/wiki/Custom-value-resolvers 的文档中尝试了完全相同的示例,但仍然给了我同样的例外
    • 如果您使用 AutoMapper 可查询扩展,则不支持 ResolveUsing:github.com/AutoMapper/AutoMapper/wiki/…
    • 所以没有办法完成我的任务?
    • 您可以使用上面“编辑”中的代码完成您的任务。它对你来说可能闻起来很糟糕,但它确实有效。如果“我的任务”是指使用ResolveUsing,那么不,automapper 在使用文档中的可查询扩展时不支持。
    • yw - 如果问题可以关闭,请投票并标记答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    相关资源
    最近更新 更多