Entity framework Automapper系统。异常“;Can';t将其解析为可查询表达式“;

Entity framework Automapper系统。异常“;Can';t将其解析为可查询表达式“;,entity-framework,automapper,iqueryable,Entity Framework,Automapper,Iqueryable,我正在尝试使用automapper中的自定义值解析器来获取运行时两个日期之间的差异 解析程序 public class TotalDaysResolver : ValueResolver<JobPersonnel, double> { protected override double ResolveCore(JobPersonnel source) { var totalDays = CalculateDaysBetween(source.Leave

我正在尝试使用automapper中的自定义值解析器来获取运行时两个日期之间的差异

解析程序

public class TotalDaysResolver : ValueResolver<JobPersonnel, double>
{
    protected override double ResolveCore(JobPersonnel source)
    {
        var totalDays = CalculateDaysBetween(source.LeaveOffice.GetValueOrDefault(), source.ReturnOffice.GetValueOrDefault());

        return totalDays;
    }

    private double CalculateDaysBetween(DateTime d1, DateTime d2)
    {
        if (d1 >= DateTime.Now || d1 == DateTime.MinValue) return 0;
        d2 = SetTimeNowIfDateOutIsMinValue(d2);

        var span = d2.Subtract(d1);
        var totalDays = span.TotalDays.ToString("F2");

        return Double.Parse(totalDays);
    }

    private DateTime SetTimeNowIfDateOutIsMinValue(DateTime d2)
    {
        if (d2 == DateTime.MinValue)
            d2 = DateTime.Now;
        return d2;
    }
}
映射

CreateMap<PersonnelVM, JobPersonnel>()
            .ReverseMap()
            .ForMember(dst => dst.TotalDays, opt => opt.ResolveUsing<TotalDaysResolver>()));
CreateMap()
.ReverseMap()
.FormMember(dst=>dst.TotalDays,opt=>opt.resolvesusing());
查询

public IEnumerable<PersonnelVM> GetAllPersonnelByJobId(int jobid)
{
    return _dbRepository.GetWhere<PersonnelVM, JobPersonnel>(w => w.JobID == jobid); //This is where I get the error
}
public IEnumerable GetAllPersonnelByJobId(int-jobid)
{
return dbRepository.GetWhere(w=>w.JobID==JobID);//这是我得到错误的地方
}
如果我注释了TotalDays映射,映射不会抛出任何错误。不幸的是,我在网上找不到任何信息来为我指明解决这个问题的方向。我对编程是新手,对automapper是新手


是否有人了解此错误和/或我如何亲自调试此问题?

在针对EF(实体)的投影操作中不允许使用
ResolveUsing
。您提到已将映射逻辑移动到视图模型中,但您也可以放弃自定义解析器,并为
MapFrom
提供参数(尽管在您的特定情况下很复杂)-请参阅

假设您的
TotalDays
属性。。。现在看起来像:

[IgnoreMap]
public double TotalDays => CalculateDaysBetween(this.LeaveOffice, this.ReturnOffice)
这与我有时使用的条件/计算属性的方法类似。我从数据库中填充“helper”属性,然后依靠getter完成解析


不幸的是,这是目前我们所能得到的最好结果(请参阅),因为AutoMapper必须将表达式树交给EF查询引擎,并丢失这些操作的上下文。

什么是
\u dbRepository.GetWhere
在做什么?它使用投影来获取所有实体。我认为这就是问题所在:解析程序在使用投影时无法正确映射。我已将冲突解决程序逻辑移到视图模型中,这是可行的。我创建了一个Nuget包来帮助缓解这种痛苦,请查看:
[IgnoreMap]
public double TotalDays => CalculateDaysBetween(this.LeaveOffice, this.ReturnOffice)