Сохранение и получение объектов разных типов с использованием LINQtoSQL - PullRequest
0 голосов
/ 11 февраля 2010

Отказ от ответственности: новичок в C # - первый раз после разработки в QA в течение нескольких лет.

Я понимаю, что разновидности этого вопроса задавались ранее (наследование в LINQtoSQL и т. П.), Но я надеюсь, что задаю вопрос по-другому.

В моей базе данных у меня будет супер-тип «Событие» и несколько подтипов: например, «Конференция», «Встреча» и «Встреча».

Event
  Id (PK)
  TypeId (FK EventTypes.Id)
  Title

Conference
  Id (PK, FK Event.Id)
  Cost
  Topic

Meeting
  Id (PK, FK Event.Id)
  Location
  Organizer

Appointment
  Id (PK, FK Event.Id)
  Time
  Address

Я использую приложение Rob Conery MVC StoreFront в качестве справочного материала. По сути, он получает данные из базы данных и создает объекты класса, вручную сопоставляя Event.Id с db.Event.Id и т. Д.

Я хотел бы сделать это с моей моделью данных Events - я бы хотел получить все события и иметь динамическое выражение LINQ, чтобы создавать различные типы событий на основе некоторых критериев (например, TypeId).

var result = from e in db.Events
             select new IEvent 
             {
                // Little help? ;)
              };

Было бы замечательно найти способ сделать это так, чтобы каждый тип события знал, как сохранить себя и извлечь себя - я боюсь писать один и тот же код для каждого типа, изменяя только поля. Имеет смысл?

Я увидел заданный вопрос, и кто-то ответил что-то вроде:

public bool Save<T>() {}

Проблема в том, что я не уверен, куда поместить этот код. Я также не уверен, должен ли я использовать интерфейс IEvent или частичный класс Event.

Теперь я закончу этот вопрос с монстром дополнительным Спасибо тем, кто может предложить помощь / предложения.

- РЕДАКТИРОВАТЬ: Хороший прогресс - переход от базы данных к представлениям все с IEvent :) ( Этот вопрос очень помог )

public class SqlEventRepository : IEventRepository

  public IQueryable<IEvent> getEvents() {
     // Get Events without doing a query for each type..possible?
     var eventType1 = {query};
     var eventType2 = {query};

     return {concat of all queries};
  }

  public bool SaveEvent(IEvent) {
    // Can I avoid calling a save function for each type of event?

}

1 Ответ

1 голос
/ 11 февраля 2010

Вы могли бы иметь вспомогательный класс для добавления вашего Save<T>() метода. Что-то вроде SaveEvents class.

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

Я бы использовал наследование, а затем, где бы вы ни передавали подкласс, используйте родительский класс (Event) в качестве аргумента. Затем вы можете довольно легко привести их к своим подклассам для доступа к этим свойствам в запросах LINQ.

EDIT:

Примерно так:

public class Event : IEvent (Interface implement common properties to all Event type classes)
{
    // your code
}

public class MeetingEvent : IEvent
{

   public string MeetingEvent
   {
      get;
      set;
   }

    // add IEvent implementation...

}

public class EventManager
{

   public void MyMethod (IEvent event)
   {

       MeetingEvent Mevent = (MeetingEvent)event;

       Mevent.DoSomework();

       // now you can cast all eventclasses to and from IEvent passed as a parameter.
   }

}
...