Automapper 自动映射函数
大家好,我正试图在Automapper中实现一些相对简单的功能,但我一直失败。 我试图用函数表达式映射Dto上的属性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
.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)));