2017-08-27 154 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,代碼爲類似那樣(來自矮胖的地圖)。

這裏是我做上面的代碼可重用的代碼:

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

但我不真的很肯定如何通過member.MemberStatusmember.MemberStatus以外的其他變量到Queries函數,我做了..要麼是QueryMultipleQuery在Dapper

我的做法是正確的嗎?或任何其他建議?

感謝

+0

您可以使用dapper擴展使其更通用。請參閱存儲庫模式:https://stackoverflow.com/a/45460483/5779732 –

回答

0

我解決我自己的問題後,像1小時努力,下面是解決方案:

例如一般的功能是被叫Helper另一個類,你要撥打的通用從另一個類功能DataAccess

Helper類:

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,而不是重複打開連接,然後返回。

也許這不是一個最好的答案,但這是我想出的,它工作正常。

謝謝