2017-08-27 2 views
0

J'ai la fonction comme ci-dessous:passer les arguments à la méthode

public IEnumerable<Member> Members(Member models) 
    { 
     string query = "SELECT a.[Name], b.[MemberStatus] FROM [Member] a WITH (NOLOCK) INNER JOIN [MemberStatus] b WITH (NOLOCK) ON a.[ID] = b.[ID]"; 

     using (IDbConnection conn = new SqlConnection(ConfigurationManager.AppSettings["MyConnection"])) 
     { 
      conn.Open(); 

      return conn.Query<Member, MemberStatus, Member>(query, (member, memberStatus) => 
      { 
       member.MemberStatus = memberStatus; 

       return member; 
      }).ToList(); 
     } 
    } 

et maintenant je veux faire une fonction générique qui peut être réutilisable, car il sera plus de 1 que le code est similaire comme ça (carte de dapper).

Voici le code que je fais le code ci-dessus qui peut être réutilisable:

public TReturn Queries<TParent, TChild, TReturn>(string query, Func<TParent, TChild, TReturn> map, object arguments) 
     { 
      using (IDbConnection conn = new SqlConnection(ConfigurationManager.AppSettings["MyConnection"])) 
      { 
       conn.Open(); 

       return conn.Query<TParent, TChild, TReturn>(query, (parent, child) => 
       { 
        // not sure on how to pass from here 
        return parent; 
       }); 
      } 
     } 

Et je peux appeler fonctionner comme membres ceci:

public IEnumerable<Member> Members(Member models) 
    { 
     string query = "SELECT a.[Name], b.[MemberStatus] FROM [Member] a WITH (NOLOCK) INNER JOIN [MemberStatus] b WITH (NOLOCK) ON a.[ID] = b.[ID]"; 

     return Helper.Queries<Member, MemberStatus, Member>(query, (member, memberStatus) => member.MemberStauts = memberStatus); 
    } 

Mais je ne suis pas vraiment sûr sur la façon de passer le member.MemberStatus ou les autres variables autres que member.MemberStatus à la fonction Queries que j'ai fait .. Soit il est QueryMultiple ou Query dans Dapper

Est-ce que ma façon de le faire est correcte? ou d'autres suggestions?

Merci

+0

Vous pouvez rendre cela plus générique en utilisant les extensions dapper. Reportez-vous au modèle de référentiel ici: https://stackoverflow.com/a/45460483/5779732 –

Répondre

0

Je résolus à ma propre question après comme 1 heure d'essayer, voici la solution:

Par exemple, la fonction générique est sur la autre classe appelée Helper, et que vous voulez appeler le générique fonction d'une autre classe DataAccess

classe d'assistance:

public IEnumerable<TReturn> Queries<TParent, TChild, TReturn>(string sql, Func<TParent, TChild, TReturn> map, string splitOn = "ID") 
     { 
      using (IDbConnection conn = new SqlConnection(ConfigurationManager.AppSettings["MyConnection"])) 
      { 
       conn.Open(); 

       return conn.Query(sql, map, splitOn: splitOn); 
      } 
     } 

Et vous appelez comme ceci:

string sql = "SELECT a.[Name], b.[MemberStatus] FROM [Member] a WITH (NOLOCK) INNER JOIN [MemberStatus] b WITH (NOLOCK) ON a.[ID] = b.[ID]"; 

return Helper.Queries<Member, MemberStatus, Member>(sql, (member, memberStatus) => 
      { 
       member.MemberStatus = memberStatus; 

       return member; 
      }); 

De cette façon, si j'ai plus besoin d'être carte, je l'appelle juste Helper.Queries, au lieu d'ouvrir la connexion répétitive puis le retourner.

Probablement ce n'est pas une meilleure réponse, mais c'est ce que j'ai trouvé et ça fonctionne bien.

Merci