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

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

// 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? Я только что сказал, что 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)))
Другие вопросы по тегам