Skip to content

Instantly share code, notes, and snippets.

@default-kramer
Created April 27, 2016 18:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save default-kramer/1635235ed670e2282ddd93f15b2530a9 to your computer and use it in GitHub Desktop.
Save default-kramer/1635235ed670e2282ddd93f15b2530a9 to your computer and use it in GitHub Desktop.
combining two individually-defined dapper queries
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