Automapper System.Exception"无法将此解析为可查询表达式"

时间:2014-11-07 17:22:01

标签: entity-framework automapper iqueryable

我正在尝试在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;
    }
}

视图模型

public class PersonnelVM
{
    public int Refno { get; set; }
    public int JobID { get; set; }}
    [UIHint("StartDate")]
    public DateTime? LeaveOffice { get; set; }
    [UIHint("EndDate")]
    public DateTime? ReturnOffice { get; set; }
    public double TotalDays { get; set; }
}

映射

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

查询

public IEnumerable<PersonnelVM> GetAllPersonnelByJobId(int jobid)
{
    return _dbRepository.GetWhere<PersonnelVM, JobPersonnel>(w => w.JobID == jobid); //This is where I get the error
}

如果我为TotalDays注释掉地图,映射不会引发任何错误。不幸的是,我无法在网上找到任何信息,无法指出解决这个问题的任何方向。我是编程的新手,也是自动播放器的新手。

有没有人能够深入了解此错误和/或我如何自行调试此问题?

1 个答案:

答案 0 :(得分:1)

在针对EF(实体)的投影操作中不允许ResolveUsing。您提到您已将映射逻辑移动到视图模型中,但您也可能放弃了自定义解析程序并为MapFrom提供了参数(尽管在您的具体情况下很复杂) - 请参阅https://github.com/AutoMapper/AutoMapper/wiki/Queryable-Extensions

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

[IgnoreMap]
public double TotalDays => CalculateDaysBetween(this.LeaveOffice, this.ReturnOffice)

这类似于我有时采用条件/计算属性的方法。我从DB填充“helper”属性,然后依靠getter来完成Resolve。

不幸的是,这是我们目前可以获得的最好的结果(参见https://github.com/AutoMapper/AutoMapper/issues/415),因为AutoMapper必须将表达式树交给EF查询引擎并丢失这些操作的上下文。