Где здесь актеры? 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)))