Невозможно преобразовать тип 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 или типов перечисления.

Как я могу решить эту проблему?


person Masoud    schedule 05.09.2015    source источник


Ответы (2)


Попробуйте так

where T : class, ITimePeriodEntity

Требуется, чтобы первое ограничение было классом. Я думаю, это нужно быть уверенным.

person umut özkan    schedule 05.09.2015

Кстати, это тоже помогло бы и, вероятно, быстрее.

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);
    }
}
person Ronald Emergo    schedule 05.04.2019