Запрос, чтобы сначала получить только корневые/базовые сущности в коде EF

Предполагать:

BaseEntity
ChildEntity : BaseEntity

Проблема заключается в том, чтобы получить базовые объекты эффективным способом. Я знаю, что работает такой тип запроса:

var results = context.BaseEntities.Where(entity => !(entity is ChildEntity) );

Однако это очень склонно к поломке, так как простое добавление другого расширения к BaseEntity, например ChildEntityTwo : BaseEntity, нарушит запрос (запрос будет включать типы BaseEntity и ChildEntityTwo.

Кроме того, у меня еще не было возможности профилировать его, но я подозреваю, что запрос загружает все объекты и фильтрует их в памяти, но я могу ошибаться с этим.

Обратите внимание, что решение context.BaseEntities.OfType<BaseEntities>() на самом деле будет включать и загружать все объекты! Это работает только тогда, когда вам нужен класс конечной точки, например ChildEntityTwo


person Mihalis Bagos    schedule 20.07.2012    source источник
comment
возможный дубликат Получить только базовый класс из Entity Framework   -  person Diego Mijelshon    schedule 20.07.2012


Ответы (1)


ESQL предлагает для этой цели оператор OFTYPE ONLY, но этот оператор не имеет эквивалент в Linq. Вы можете использовать этот обходной путь для сборки OFTYPE ONLY для Linq.

person Ladislav Mrnka    schedule 20.07.2012
comment
Спасибо за ответ! Пошел с обходным путем, а также с этой ссылкой: stackoverflow.com/questions/11252096/, который помогает получить доступ к объектному контексту, но использует магические строки. Любая идея, как я мог бы сделать это без волшебных строк? - person Mihalis Bagos; 21.07.2012
comment
Более того, есть ли способ использовать это расширение в свойстве навигации ICollection? Я изучаю это, пока мы говорим. - person Mihalis Bagos; 21.07.2012
comment
Кроме того, я нашел это 'msdn.microsoft.com/en-us/library/', но я понятия не имею, как я могу получить доступ к CommandTree - person Mihalis Bagos; 21.07.2012
comment
Поскольку кажется, что это подложка и недоступна легко, кроме ESQL. - person Mihalis Bagos; 21.07.2012