Created
April 27, 2016 18:16
-
-
Save default-kramer/1635235ed670e2282ddd93f15b2530a9 to your computer and use it in GitHub Desktop.
combining two individually-defined dapper queries
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
interface IDapperQuery<out TResult> | |
{ | |
string GetSql(); | |
DynamicParameters GetParameters(); // <--- can't make this work | |
IDictionary<string, object> GetParametersAsDict(); // this works | |
TResult MapResult(SqlMapper.GridReader reader); | |
} | |
// Combines both queries for one DB round trip | |
class CombinedQuery<T1, T2> : IDapperQuery<Tuple<T1, T2>> | |
{ | |
private readonly IDapperQuery<T1> query1; | |
private readonly IDapperQuery<T2> query2; | |
public string Prefix1 { get; set; } = "q1_"; | |
public string Prefix2 { get; set; } = "q2_"; | |
public CombinedQuery(IDapperQuery<T1> q1, IDapperQuery<T2> q2) | |
{ | |
this.query1 = q1; | |
this.query2 = q2; | |
} | |
public string GetSql() | |
{ | |
// Combine two sql statements into one. | |
// Parameters get prefixed, e.g. @myParam becomes @prefix_myParam | |
string sql1 = query1.GetSql(); | |
sql1 = ReplaceParameters(sql1, query1.GetParametersAsDict().Keys, Prefix1); | |
string sql2 = query2.GetSql(); | |
sql2 = ReplaceParameters(sql2, query2.GetParametersAsDict().Keys, Prefix2); | |
return string.Format("{0};\n\n{1}", sql1, sql2); | |
} | |
private static string ReplaceParameters(string sql, IEnumerable<string> paramNames, string prefix) | |
{ | |
foreach (var name in paramNames) | |
{ | |
string original = "@" + name; | |
string replacement = "@" + prefix + name; | |
sql = sql.Replace(original, replacement); | |
} | |
return sql; | |
} | |
public DynamicParameters GetParameters() | |
{ | |
// Cannot do this with current public interface | |
throw new NotImplementedException(); | |
} | |
public IDictionary<string, object> GetParametersAsDict() | |
{ | |
// combine the 2 dictionaries into 1 with the prefixes added | |
var combined = new Dictionary<string, object>(); | |
foreach (var kvp in query1.GetParametersAsDict()) | |
{ | |
combined[Prefix1 + kvp.Key] = kvp.Value; | |
} | |
foreach (var kvp in query2.GetParametersAsDict()) | |
{ | |
combined[Prefix2 + kvp.Key] = kvp.Value; | |
} | |
return combined; | |
} | |
public Tuple<T1, T2> MapResult(SqlMapper.GridReader reader) | |
{ | |
var first = query1.MapResult(reader); | |
var second = query2.MapResult(reader); | |
return Tuple.Create(first, second); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment