使用 LINQtoSQL 保存和检索不同类型的实体

问题描述 投票:0回答:1

免责声明:有点像 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 等

我想用我的事件数据模型来做到这一点——我想检索所有事件,并有一个足够动态的 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?
  }
  
linq-to-sql inheritance orm linq-to-entities
1个回答
1
投票

你可以有一个帮助类来放入你的

Save<T>()
方法。像
SaveEvents
类。

当您想使用 LINQ 保存时,我不确定您是否可以使用泛型,因为您不知道 T 是什么,因此无法更新查询中的属性。

我会使用继承,然后在传递子类的地方,使用父类(事件)作为参数。然后你可以很容易地转换到你的子类来访问你的 LINQ 查询中的那些属性。

编辑:

像这样的东西:

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.
   }

}
© www.soinside.com 2019 - 2024. All rights reserved.