Automapper 自动映射函数

Automapper 自动映射函数,automapper,Automapper,大家好,我正试图在Automapper中实现一些相对简单的功能,但我一直失败。 我试图用函数表达式映射Dto上的属性 .ForMember(dest => dest.HasPaid, opt => opt.MapFrom(c => MapHasPaid(c))) private bool MapHasPaid(AppUser src) { var lastPayment = src.RentPayments.OrderByDescendi

大家好,我正试图在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;
    }
.ForMember(dest=>dest.haspady,opt=>opt.MapFrom(c=>maphaspady(c)))
私有布尔MapHasPaid(AppUser src)
{
var lastPayment=src.RentPayments.OrderByDescending(p=>p.DateTo.FirstOrDefault();
如果(lastPayment==null)
{
返回false;
}

return lastPayment.DateFrom.Date我希望您尝试将其用于AutoMapper的投影?问题是您尝试实现的
Resolve
函数正在进行无法在LINQ中转换为实体的调用。基本上,LINQ在您正在进行的某个C#调用之间没有映射正在响应SQL以在数据库上运行

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

使用与您完全相同的
DbFunctions
方法,或者首先检索数据(在查询中调用
.ToList()
或类似方法),然后映射到您的目标类型

这在中有记录

编辑:


如果您使用的是AutoMapper可查询扩展,则不支持ResolveUsing

如果在我的CustomResolver中,我将整个Resolve方法替换为“return true”,它仍然抛出“Can NOT Resolve this to Queryable Expression”。正如我在帖子中所说,我在的文档中尝试了完全相同的示例,但仍然给出了相同的例外情况。如果您使用的是AutoMapper可查询扩展,则不支持ResolveUsing:因此无法完成我的任务?您可以使用“编辑”中的代码完成任务上面。它可能对您来说很难闻,但它可以工作。如果“我的任务”是指使用
ResolveUsing
,则不支持,automapper在根据文档使用可查询扩展时不支持。yw-如果问题可以关闭,请向上投票并标记答案。
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>())
.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)));