Шаблоны наследования Linq to SQL - PullRequest
2 голосов
/ 04 марта 2010

Caveat emptor, я новичок в Linq To SQL.

Я создаю прототип, чтобы преобразовать существующее приложение для использования Linq To SQL для своей модели (это приложение MVVM). Поскольку приложение существует, я не могу изменить его модель данных.

База данных включает в себя информацию о событиях; это либо рекламные мероприятия, либо призовые. Таким образом, модель данных включает в себя таблицу (Event) с двумя связанными таблицами (AdvertisingEvent и PrizeEvent). В моем старом коде на C # у меня был базовый класс (Event) с двумя подклассами (AdvertisingEvent и PrizeEvent), и я использовал фабричный метод для создания соответствующего варианта.

Этого нельзя сделать в Linq to SQL, он не поддерживает эту стратегию наследования.

То, о чем я думал, это создание интерфейса (IEvent), включающего базовую общую функциональность (например, свойство «Описание», которое реализовано в каждом подклассе). Я подумал, что тогда я добавлю свойство в суперкласс, например SharedStuff, который будет возвращать AdvertisingEvent или PrizeEvent в качестве IEvent . Из WPF я мог бы затем привязаться к MyEvent.SharedStuff.Description.

Имеет ли это смысл? Есть лучший способ сделать это?

Кстати: я бы предпочел не переезжать в Линк в Сущности.

1 Ответ

0 голосов
/ 04 марта 2010

Вы всегда можете использовать наследование интерфейса для достижения этой цели. Вместо того, чтобы работать с подклассами, используйте свой интерфейс IEvent, из которого вытекают интерфейсы IPrizeEvent и IAdvertisingEvent.

Затем работайте в терминах интерфейсов.

Тогда вы могли бы иметь отдельные реализации, которые не являются производными друг от друга, но реализуют соответствующие интерфейсы.

Кроме того, приятным побочным эффектом работы с наследованием интерфейса в LINQ-to-SQL является то, что если у вас есть методы, работающие на IQueryable<T>, где ограничение на T равно IEvent, вы можете сделать что-то вроде этого: *

// Get an IQueryable<AdvertisingEvent>
IQueryable<AdvertisingEvent> events = ...;

// A function to work on anything of type IEvent.
static IQueryable<T> FilteredEvents<T>(this IQueryable<T> query, 
    string description)
    where T : class, IEvent

{
    // Return the filtered event.
    return query.Where(e => e.Description == description);
}

А затем позвоните так:

events = events.FilteredEvents("my description");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...