2010-11-23 7 views
0

J'interroge une table avec une requête SQL (la table est déterminée dynamiquement). Toutes les tables implémentent l'interface ITableIsFile. Voici le code problématique.Erreur lors de l'utilisation de l'interface en tant que type

  string sql = "Select * from " + file + " where userID = '" + currAgentTM.systemuserid.Value 
      + "' and CallStatusID = null"; 
     var records = appelsDataContext.ExecuteQuery<ITableIsFile>(sql); 

Sur la dernière ligne, je reçois l'erreur suivante: Le type « MRS_Admin.ITableIsFile » doit déclarer une constructer par défaut (parameterless) afin d'être construit au cours de la cartographie. D'après ce que je sais (et que j'ai testé), il n'est pas possible d'implémenter un constructeur dans une interface.

Merci pour toute aide que vous pouvez fournir, il est très apprécié. Mathieu

+0

Je pense que vous pourriez avoir besoin de fournir une classe concrète qui implémente l'interface, pas votre interface directement. – asawyer

+0

Mais je ne sais pas quelle table sera interrogée. Ou peut-être que je n'utilise pas la meilleure façon d'interroger? – Mathieu

+0

Si vous utilisez les instructions sql de chaîne, je supprimerais le contexte linq et mapperais directement le jeu de données brut retourné à mes objets, probablement avec une réflexion. – asawyer

Répondre

2

Je pense que AS-CII signifie que vous devez créer une classe de base à partir de l'interface, et utiliser ce type. Par exemple, au lieu de:

interface ISomething { } 

class SomethingOne : ISomething { } 

class SomethingTwo : ISomething { } 

essayer:

interface ISomething { } 

class SomethingBase : ISomething { } 

class SomethingOne : SomethingBase { } 

class SomethingTwo : SomethingBase { } 

Mais notez les exigences de la section des remarques ici http://msdn.microsoft.com/en-us/library/bb361109.aspx

+0

Cela renvoie exactement la même erreur, malheureusement. – Mathieu

+0

Oh, je comprends ce que vous voulez dire. Désolé, je n'ai pas lu attentivement. Je réessaie et ça semble fonctionner. Thanx – Mathieu

1

Vous devez utiliser l'implémentation de l'interface avec un constructeur sans paramètre.

+0

Si j'ajoute un constructeur à l'interface, j'obtiens: Les interfaces ne peuvent pas contenir de constructeurs – Mathieu

+0

En fait vous n'avez pas besoin de mettre le constructeur dans votre interface. Vous devez implémenter l'interface dans une classe concrète. –

Questions connexes