2016-01-14 7 views
0

J'ai une méthode que je veux utiliser différemment en fonction du type d'entrée. Voilà ce que j'ai:C# reconnaître sql uniqueidentifier

public static DataTable GetS(string source = null, string customer = null) 
    { 
     if (source != null && customer == null) 
     { 
      return GetDataTableFromQuery("db.GetS", new object[] { "@source", source }); 
     } 
     else if (source == null && customer != null) 
     { 
      return GetDataTableFromQuery("db.GetS", new object[] { "@customer", customer }); 
     } 
     else 
     { 
      throw new Exception("Bad input. Call GetS with GetS(source) or GetS(null,customer)."); 
     } 
    } 

Le sp ressemble à ceci:

CREATE PROCEDURE [db].[GetS] 

    @source as nvarchar(128) = NULL, 
    @customer as nvarchar(128) = NULL 

AS 
BEGIN 
IF @customer IS NULL 
BEGIN 
    SELECT 
     * 
    FROM 
     db.S 
    WHERE 
     [Source] = @source 
END 
IF @source IS NULL 
BEGIN 
    SELECT 
     * 
    FROM 
     db.S 
    WHERE 
     customer = @customer 
END 

END 

Cela fonctionne bien pour GetS(source) et GetS(null,customer) mais j'ai 2 questions.

  1. il va mal si quelqu'un devait appeler avec GetS(customer)
  2. il ne semble pas très joli ..

est-il un moyen de faire quelque chose comme ça (pseudo-code):

public static DataTable GetS(string input) 
{ 
    if(input is sql-uniqueidentifier) 
    { 
     return GetDataTableFromQuery("db.GetS", new object[] { "@source", input}); 
    } 
    else 
    { 
     return GetDataTableFromQuery("db.GetS", new object[] { "@customer", input]); 
    } 
} 

ou existe-t-il un meilleur moyen? (Bien sûr, je pourrais faire 2 méthodes séparées, mais je voudrais le faire fonctionner avec un seul Get -method.Semble bizarre si je fais un GetSBySource ou quelque chose).

+0

Quel est le problème exact? Erreurs de développeur? Pourquoi voulez-vous mettre cela en une seule méthode? Y aura-t-il un cas où vous voulez passer les deux valeurs? Quelle est l'utilisation de 'sql-identifier'? –

+0

Je pense que c'est plus sur l'architecture – BendEg

+2

Si 'source' est supposé être un identifiant unque alors pourquoi est-ce un' string' et pas un 'Guid'? – juharr

Répondre

3

Dans votre cas, pourquoi ne pas écrire deux méthodes, ce n'est pas bizarre !!? Je pense que l'utilisation de deux méthodes est la meilleure façon.

  1. public static DataTable GetSBySource(Guid source)
  2. public static DataTable GetSByCustomer(string customer)

Cela rendrait vos moyens API plus utilisable et clair.

Si vous le savez, cette fois-là que vous avez besoin pour passer un Uniqueidentifier, vous pouvez aussi faire générique:

public static DataTable GetS<T>(string input) 
{ 
    if(T is Guid) 
    { 
     return GetDataTableFromQuery("db.GetS", new object[] { "@source", input}); 
    } 
    else 
    { 
     return GetDataTableFromQuery("db.GetS", new object[] { "@customer", input]); 
    } 
} 

Mais alors vous devriez aussi faire générique, car en passant votre entrée Guid s comme string s autour, n'est pas très agréable ...

L'utilisation de mauvaises définitions de méthode, causera beaucoup de problèmes, lors de la modification du code. Par exemple, vous devez passer un Guid à la méthode, qui accepte uniquement les chaînes, que le refactoring ou la modification du code sera très difficile. En outre, la définition d'une méthode, devrait décrire son utilisation ...

+0

ok. Merci pour la réponse, je suis allé avec les 2 méthodes distinctes à la fin =) –