自动映射函数

时间:2017-05-20 15:42:14

标签: automapper

大家好我想在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无法识别方法&#39;布尔MapHasPaid(xxxx.Models.AppUser)&#39;方法,并且此方法无法转换为商店表达式。

我尝试使用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)));

1 个答案:

答案 0 :(得分:0)

我希望你试图在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