2009-09-06 72 views
3

我有一個數據庫中有兩個表,非常相似的模式,需要以類似的方式查詢。我爲linq實體創建了一個部分類,然後讓這些類實現了一個接口IEvent,它定義了我需要的具有匹配簽名的所有屬性。所有這一切都很好,我可以將結果投給IQueryable,並使用相同的代碼處理來自多個源的數據。我無法弄清楚的是根據「DataSource」(即事件表)當前處於活動狀態來獲取表的一種很好的方式,所以目前我有這個令人討厭的switch語句,如果添加了另一個數據源,我將不需要更新,不喜歡它一點。任何人有什麼奇思妙想,它是晚在這裏和我的大腦失敗...:-S動態Linq.Table <TEntity>可能嗎?

的代碼是這樣的:

private IQueryable<IEvent> getEvents(IEnumerable<int> IDs) 
     { 
      var db = new EventDataContext(); 
      // activeDataSource is an enum defined elsewhere 
      switch (activeDataSource) 
      { 
       case DataSource.Source1: 
        return db.Events1.Where(e => IDs.Contains(e.ID)).Cast<IEvent>(); 
        break; 
       case DataSource.Source2: 
        return db.Events2.Where(e => IDs.Contains(e.ID)).Cast<IEvent>(); 
        break; 
      } 
     } 

回答

4

我建議製作方法一般使用DataContext.GetTable()

private IQueryable<IEvent> getEvents<T>(IEnumerable<int> IDs) 
    where T : class, IEvent 
{ 
    var db = new EventDataContext(); 
    return db.GetTable<T>.Where(e => IDs.Contains(e.ID)).Cast<IEvent>(); 
} 
+0

嗨,這看起來正是我一直在尋找,但是當我tryed來實現它,我得到了在VS「T必須是引用類型才能使用它作爲一個參數‘TEntity’」以下錯誤。約束到像Event1這樣的作品,但是這種做法違背了目的。 :( – withakay

+0

我給T添加了一個類約束。這意味着T可以是任何實現IEvent的類。 – jrummell

+0

嗨,感謝您花時間回答,這是非常方便的東西,嚴格地說,您已經回答了我的問題所以我會給你信用的,我仍然面臨着決定T應該放在哪裏的問題,假設我想從配置文件中提取數據源,但我正在避免它,但是我正在考慮反思可能性 – withakay