大家好我想在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)));
答案 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