无法将类型A强制转换为类型B. LINQ to Entities仅支持强制转换EDM原语或枚举类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法将类型A强制转换为类型B. LINQ to Entities仅支持强制转换EDM原语或枚举类型相关的知识,希望对你有一定的参考价值。

我在我的项目中首先使用EF代码,我有以下实体:

public class WorkcenterCapacity : ITimePeriodEntity
{
    public int Id { get; set; }
    public decimal AvailableCapacity { get; set; }
    public DateTime FromTime { get; set; }
    public DateTime ToTime { get; set; }
}
public interface ITimePeriodEntity
{
    DateTime FromTime { get; set; }
    DateTime ToTime { get; set; }
}  

我使用PredicateBuilder制作动态谓词。我为可用性目的定义了以下泛型类:

public static class CropPredicateBuilder<T> where T : ITimePeriodEntity
{
    public static Expression<Func<T, bool>> Creat(DateTime windowStart,
                                                  DateTime windowFinish)
    {
        var result = PredicateBuilder.False<T>();
        Expression<Func<T, bool>> completelyInWindowRanges =
            x => x.FromTime >= windowStart && x.ToTime <= windowFinish;
        Expression<Func<T, bool>> startIsInWindowRanges =
            x => x.FromTime >= windowStart && x.FromTime <= windowFinish;
        Expression<Func<T, bool>> finishIsInWindowRanges =
            x => x.ToTime >= windowStart && x.ToTime <= windowFinish;
        Expression<Func<T, bool>> overlapDateRangeWindow =
            x => x.FromTime <= windowStart && x.ToTime >= windowFinish;

        return result.Or(completelyInWindowRanges)
            .Or(startIsInWindowRanges)
            .Or(finishIsInWindowRanges)
            .Or(overlapDateRangeWindow);
    }
}

并使用如下:

var predicate = CropPredicateBuilder<WorkcenterCapacity>
               .Creat(DateTime.Now,DateTime.Now.AddDays(10));

var workcenterCapacities = dbContext.WorkcenterCapacities
            .AsNoTracking()
            .Where(predicate)
            .AsExpandable()
            .ToList();

但是当我运行它时,我得到以下错误:

无法将“WorkcenterCapacity”类型强制转换为“ITimePeriodEntity”。 LINQ to Entities仅支持转换EDM原语或枚举类型。

我怎么解决这个问题?

答案

试试这样吧

where T : class, ITimePeriodEntity

想要第一个约束是类。我认为这是肯定的。

另一答案

顺便说一句,这也可以做到这一点,而且可能更快。

public static class CropPredicateBuilder<T> where T : class, ITimePeriodEntity
{
    public static Expression<Func<T, bool>> Creat(DateTime windowStart,
                                                  DateTime windowFinish)
    {
        var result = PredicateBuilder.False<T>();
        Expression<Func<T, bool>> startBeforeToTime =
            x => windowStart <= x.ToTime;
        Expression<Func<T, bool>> finishAfterFromTime =
            x =>  windowFinish >= x.FromTime;

        return result.Or(startBeforeToTime)
            .Or(finishAfterFromTime);
    }
}

以上是关于无法将类型A强制转换为类型B. LINQ to Entities仅支持强制转换EDM原语或枚举类型的主要内容,如果未能解决你的问题,请参考以下文章

无法将“Newtonsoft.Json.Linq.JObject”类型的对象强制转换为“Newtonsoft.Json.Linq.JArray”

LINQ to Entities 仅支持使用 IEntity 接口强制转换 EDM 基元或枚举类型

如何解决 - 无法使用Automapper将Generic.List强制转换为Linq.IQueryable?

System.InvalidCastException: 无法将类型为“LabelManager2.ApplicationClass”的 COM对象强制转换为

无法将类型“System.Linq.IQueryable<int>”隐式转换为“int?”

无法将匿名类型从“System.Linq.IQueryable”转换为“System.Data.Entity.Core.Objects.ObjectQuery”