наследование и полиморфизм в LinqToSql - PullRequest
0 голосов
/ 16 февраля 2012

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

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

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

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

Спасибо.

ОБНОВЛЕНИЕ:
picture

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

Ответы [ 3 ]

1 голос
/ 16 февраля 2012

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

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

1 голос
/ 16 февраля 2012

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

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

Предполагается, что вы настроили Linq2Sql так, чтобы он понимал, что ваше свойство EventCategories является дискриминатором .

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

0 голосов
/ 16 февраля 2012

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

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

вернет только типы Derived1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...