SELECT
a.*
FROM dbo.ptype a
INNER JOIN dbo.PType_Price b ON a.typeId=b.PTypeID
LEFT JOIN dbo.PType_Units c ON a.typeId=c.UnitsId
WHERE a.typeId=@typeid AND a.CreateDate=@Area
AND preprice1=@preprice1 AND deleted=@deleted
public class SqlHelper
{
public Dictionary<string, object> Param = new Dictionary<string, object>();
public string ReplaceParam(ref string sql)
{
if (Param.Count == 0)
{
return sql;
}
StringBuilder sb = new StringBuilder();
sb.Append(sql);
foreach (var item in Param)
{
var paramName = item.Key;
var paramValue = item.Value;
var type = paramValue.GetType();
if (type == typeof(string) || type == typeof(DateTime))
{
//字符串
sb.Replace($"@{paramName}", $"'{paramValue}'");
}
else if (type == typeof(bool))
{
//bool 类型
if (paramValue.ToString() == "True")
{
sb.Replace($"@{paramName}", "1");
}
else
{
sb.Replace($"@{paramName}", "0");
}
}
else
{
//数值
sb.Replace($"@{paramName}", paramValue.ToString());
}
}
sql = sb.ToString();
return sql;
}
}
调用示例:
public IEnumerable<Ptype> GetPtypeDetail()
{
var sql = @"
SELECT a.*
FROM dbo.ptype a
INNER JOIN dbo.PType_Price b ON a.typeId=b.PTypeID
LEFT JOIN dbo.PType_Units c ON a.typeId=c.UnitsId
WHERE a.typeId=@Typeid AND a.CreateDate=@CreateDate
AND preprice1=@preprice1 AND deleted=@deleted
";
var sqlHelper = new SqlHelper();
sqlHelper.Param.Add("Typeid", "001");
sqlHelper.Param.Add("CreateDate", DateTime.Now);
sqlHelper.Param.Add("preprice1", 3.62M);
sqlHelper.Param.Add("deleted", true);
sqlHelper.ReplaceParam(ref sql);
IEnumerable<Ptype> plist = new List<Ptype>();
using (var con = SQLServerHelper.GetConnection())
{
plist = con.Query<Ptype>(sql);
}
return plist;
}
这样丢给Dapper 执行的SQL 始终是最终SQL, 就不用煞费苦心去抓了.
PS: 有人可能会质疑这样替换的效率,不用担心已测试 , C#的字符串替换是非常快的, 上面的调用实例, 当时的测试结果是 微妙和纳秒级别, 有兴趣的看管可以再测试.