2010-06-23 4 views
1

Supposons que j'ai une table appelée Utilisateur. LINQ desinger, je vais finir par ce qui suit:Générique avec Linq DataContext

  • Un fichier appelé User.dbml
  • Une classe de contexte de données appelé UserDataContext qui sous-classes de System.Data.Linq.DataContext
  • Une classe appelée User qui est mappée à partir de la table User. Un objet UserDataContext aura une propriété appelée Utilisateurs qui est de type System.Data.Linq.Table < Utilisateur>.

Jusqu'ici tout va bien. Maintenant, je veux définir une classe de base générique qui convertit la propriété Linq.Table en chaîne JSON pour toutes ses sous-classes. Donc j'aurais:

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); 
    } 
} 

Pour terminer le code dans la question, voici un exemple d'une sous-classe:

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 
} 

Pour résumer, la question est de savoir comment éviter la mise en œuvre GetJSONData() à tous les sous-classes en laissant la classe de base le faire.

Répondre

6

On ne sait pas quelle table vous voulez. Il existe potentiellement plusieurs tables dans un contexte de données unique. Il peut ne pas être dans votre modèle particulier, mais il peut certainement être dans LINQ to SQL en général.

Vous pouvez appeler DataContext.GetTable(Type) ou DataContext.GetTable<T> si c'est utile ... et vous pouvez paramétrer votre classe par le type d'entité, ainsi que le type de contexte:

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>()); 
    } 
} 

Est-ce que vous êtes après?

+0

C'est exactement ce que je suis après. Il semble que GetType () provoque une erreur de compilation et que GetType() soit simplement suffisant, donc le second paramètre paramétré TEntity n'est pas nécessaire? –

+0

@Khnle: Vous avez juste besoin d'une contrainte de classe sur TEntity. Mettra à jour le code. Vous devez également appeler GetTable, pas GetType - faute de frappe de ma part. –

Questions connexes