Где здесь актеры? LINQ to Entities поддерживает только моделирование примитивных типов данных Entity Data Model

У меня есть несколько таблиц фреймворка сущности, которые я сделал поддержкой интерфейса IHistoricEntity, используя их классы родительского класса. IHistoricEntity имеет свойство ActiveTo Datetime?.

// Auto generated LINQ to Entities domain service:
[EnableClientAccess()]
public partial class ProductService : LinqToEntitiesDomainService<ProductDBEntities>
{
    public IQueryable<ANALYSIS_CODES> GetANALYSIS_CODES()
    {
        return this.ObjectContext.ANALYSIS_CODES;
    }
 ...
}

// My Partial class to add interface
public partial class ANALYSIS_CODES : IHistoricEntity
{}

Я пытаюсь реорганизовать этот рабочий код на метод:

List<ANALYSIS_CODE> filtered = (from rec in ps.GetANALYSIS_CODES() where rec.ActiveTo == null select rec).ToList()

Так же:

private List<T> Filter<T>(IQueryable<T> queryable) where T : IHistoricEntity
{
    return (from rec in queryable where rec.ActiveTo == null select rec).ToList();
}

// called like this:
List<ANALYSIS_CODE> filtered = Filter(ps.GetANALYSIS_CODES());

Это дает это исключение на ToList:

Невозможно передать тип "ANALYSIS_CODES" для ввода "IHistoricEntity". LINQ to Entities поддерживает только листинг примитивных типов данных Entity Data Model.

Но где я попросил его наложить на IHistoricEntity? Я mearly сказал, что T должен поддерживать IHistoricEntity.

Ответ 1

rec.ActiveTo относится к свойству, определенному в вашем интерфейсе. Поэтому Linq необходимо передать rec в IHistoricEntity, прежде чем сможет получить доступ к этому свойству.

Не обманывайте себя тем исключением, которое возникает в .ToList(): запрос Linq оценивается и выполняется только тогда, когда необходимы записи, в этом случае, когда коллекция должна быть преобразована в List<>.

Обновить: я проверил комментарий @hvd, и, действительно, добавление предложения where T: class изменяет выражение Linq из

System.Collections.Generic.List`1[MyType]
    .Where(x => (Convert(x).ActiveTo == Convert(null)))

к

System.Collections.Generic.List`1[MyType]
    .Where(x => (x.ActiveTo == Convert(null)))