【发布时间】: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