2012-02-16 4 views
0

У меня есть базовый класс BaseEvent.
И, 3 класса, полученные из BaseEvent: Derived1, Derived2, Derived3Наследование и полиморфизм в LinqToSql

Предположим, мы имеем следующий запрос:

Database.BaseEvents.Where(e => e.EventsCategories.Any(
     c => c.EventCategories== category.OID)).ToList(); 

Как сделать этот запрос сбор возвращение производных объектов, не BaseEvent?

Спасибо.

UPDATE:
picture

но тип должен быть Film

+0

могли бы вы предоставить пример кода, как этот массив должен быть жёстко? Например: Список {2,3,5,7} имеет 4 ints: 2,3,5,7 – Archeg

+0

Как я уже говорил ранее, вам нужно настроить поле дискриминатора, которое сообщает Linq2Sql, какой производный тип использовать. –

ответ

1

Cast Используйте метод:

Database.BaseEvents.Where(e => e.EventsCategories.Any(
    c => c.EventCategories== category.OID)).Cast<DerivedType>().ToList(); 

Предполагая, что вы имеете установки Linq2SQL так, что он понимает ваши EventCategories Недвижимость discriminator.

Обновление: Поле дискриминатора сообщает Linq2Sql, какой тип он должен использовать в зависимости от значения поля. Если вы не настроили такое поле. Linq2Sql всегда будет возвращать базовый тип. A google query доставит вам массу хороших сообщений о том, как это сделать.

+0

но, я не знаю, какой объект будет возвращен. Предположим, что этот запрос возвращает 2 объекта: производные1 и производные2. – user348173

+0

Cast будет генерировать исключение, если есть некоторые BaseEvents, которые являются DerivedType2, но не DerivedType – Archeg

+0

@ user348173, в этом случае вы не можете этого сделать. Если вы хотите содержать список объектов с разными типами, этот список должен быть типизирован как общий родительский тип - и это называется полиморфизмом – Archeg

-1

Вы можете использовать OfType метод:

Database.BaseEvents.Where(e => e.EventsCategories.Any(
    c => c.EventCategories== category.OID)).OfType<Derived1>.ToList(); 

будет возвращать только те типы Derived1

1

Из комментария я вижу, что вы можете иметь различные типы производных объектов в коллекции.

В этом случае не видно причин, по которым коллекция будет передана в какой-либо конкретный производный тип, просто верните коллекцию base, как вы делаете это сейчас. Но каждый реального объекта в этой коллекции будет иметь конкретный тип Derived1, Derived2, Derived3 ...

+0

нет, этот запрос верните мне BaseEvent.См. Изображение в вопросе, пожалуйста – user348173

+0

@ user348173: так что содержание этого списка. ? Как вы создаете и заполняете этот список? – Tigran