2010-06-23 65 views
1

假設我有一個表,名爲用戶。使用LINQ desinger,我將結束與以下:通用Linq DataContext

  • 一個名爲User.dbml
  • 一個名爲UserDataContext數據上下文類的子類System.Data.Linq.DataContext
  • 從User表映射的名爲User的類。 UserDataContext對象將具有名爲用戶的屬性,其類型爲System.Data.Linq.Table <用戶>

到目前爲止好。現在我想定義一個通用基類,將Linq.Table屬性轉換爲所有子類的JSON字符串。因此,我將有:

using Newtonsoft.Json; 

class BasePlugin<T> where T : System.Data.Linq.DataContext, new() 
{ 
    protected T DataContext = new T(); 
    protected string GetJSONData() 
    {    
     //*** DataContext if of type System.Data.Linq.DataContext, therefore it won't know the Linq Table property of its subclasses 
     return JsonConvert.SerializeObject(DataContext.Cannot_get_subclass_property_Linq_table); 
    } 
} 

要完成該問題的代碼,這裏有一個子類的實例:

class UserPlugin : BasePlugin<UserDataContext> 
{ 
    //The protected member DataContext inherited from BasePlugin 
    //has a property called Users of type System.Data.Linq.Table<User>. 
    //The point to to avoid implementing GetJSONData() in all subclasses 
} 

總之,問題是如何避免在所有子類實現GetJSONData()讓基類去做。

回答

6

目前還不清楚你想要哪張桌子。單個數據上下文中可能有多個表。在你的特定模型中可能沒有,但是一般情況下,LINQ to SQL肯定是可以的。

您可以撥打DataContext.GetTable(Type)DataContext.GetTable<T>如果這是有用的......你可以通過實體類型以及上下文類型參數類:

class BasePlugin<TContext, TEntity> where TContext : DataContext, new() 
    where TEntity : class 
{ 
    protected TContext DataContext = new TContext(); 
    protected string GetJSONData() 
    {    
     return JsonConvert.SerializeObject(DataContext.GetTable<TEntity>()); 
    } 
} 

是你以後在做什麼?

+0

這完全是我所追求的。它看起來像GetType ()會導致編譯錯誤,而GetType()就足夠了,所以不需要第二個參數化參數TEntity? – 2010-06-23 20:26:57

+0

@Khnle:你只需要一個TEntity的類約束。將更新代碼。您還需要調用GetTable,而不是GetType - 我的部分錯別字。 – 2010-06-23 20:49:53