0

I have the function like below:

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

and now I want to make a generic function which can be re-usable, since it will be more than 1 that the code is similar like that (map from dapper).

Here is the code that I make for the above code that can be re-usable:

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

And I can call in Members function like this:

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

But I am not really sure on how to pass the member.MemberStatus or the other variables other than member.MemberStatus to the Queries function that I made.. Either it is QueryMultiple or Query in Dapper

Is my way of doing it is correct? or any other suggestions?

Thanks

Natsuki
  • 13
  • 4
  • You can make this more generic using dapper extensions. Refer the Repository Pattern here: https://stackoverflow.com/a/45460483/5779732 – Amit Joshi Aug 29 '17 at 13:47

1 Answers1

0

I solved my own question after like 1 hour of trying, below is the solution:

For example the generic function is on the another class called Helper, and you want to call the generic function from another class DataAccess

Helper class:

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

And you call like so:

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

This way, if I have any more need to be map, i just call Helper.Queries, instead of repetitive open the connection and then return it.

Probably this is not a best answer, but this is what I came up with and it is working fine.

Thanks

Natsuki
  • 13
  • 4