Ich habe die Funktion wie folgt:
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();
}
}
und jetzt möchte ich eine generische Funktion machen, die wiederverwendbar sein kann, da es mehr als 1 ist, dass der Code ähnlich ist (map von dapper).
Hier ist der Code, den ich für den obigen Code mache, der wiederverwendet werden kann:
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;
});
}
}
Und ich kann Mitglieder wie folgt aufrufen:
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);
}
Aber ich bin nicht wirklich sicher, wie man den member.MemberStatus
oder die anderen Variablen außer member.MemberStatus
an die von mir erstellte Queries
Funktion QueryMultiple
. Entweder ist es QueryMultiple
oder Query
in Dapper
Ist meine Art, es zu tun, richtig? oder irgendwelche anderen Vorschläge?
Vielen Dank
Ich habe meine eigene Frage gelöst, nachdem ich 1 Stunde probiert habe, unten ist die Lösung:
Zum Beispiel befindet sich die generische Funktion in der anderen Klasse namens Helper
und Sie möchten die generische Funktion von einer anderen Klasse DataAccess
Helferklasse:
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);
}
}
Und du rufst so an:
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;
});
Auf diese Weise, wenn ich mehr brauchen, um Karte zu sein, ich rufe nur Helper.Queries, anstatt wiederholt die Verbindung zu öffnen und es dann zurückzugeben.
Wahrscheinlich ist das keine beste Antwort, aber das ist es, was ich herausgefunden habe und es funktioniert gut.
Vielen Dank