2017-08-27 7 views
0

私は機能以下のように持っている:メソッドに引数を渡す

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

、今私はそれがコードがあることを1以上になりますから、再利用可能な汎用的な機能を作りたいですそれと同じように(dapperからのマ​​ップ)。このように機能

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

そして、私はメンバーに呼び出すことができます:ここで

は、私は再利用することができます上記のコードのために作るのコードである

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

しかし、私はないです私が作ったQueriesの機能にmember.MemberStatusやその他の変数member.MemberStatusを渡す方法は本当に確かです。DapperのQueryMultipleまたはQueryのいずれか

私のやり方は正しいのですか?その他の提案はありますか?

おかげ

+0

これをより一般的な拡張機能を使用して作成することができます。リポジトリパターンはhttps://stackoverflow.com/a/45460483/5779732を参照してください。 –

答えて

0

以下、しようとするの1時間は、ソリューションですのような後に私は自分の質問を解決:

例えば、一般的な機能がHelperと呼ばれる別のクラスであり、そしてあなたがジェネリックを呼び出したいです別のクラスから関数DataAccess

ヘルパークラス:

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

そして、あなたがそうのように呼び出す:私はマップすべきより多くの必要性を持っている場合

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

をこの方法で、私はちょうどHelper.Queriesを呼び出し、代わりの繰り返しの接続をオープンし、それを返します。

おそらくこれは最善の答えではありませんが、これは私が思いついたもので、うまくいきます。

ありがとうございました

関連する問題