我正在使用dapper in my .NET 3.5 project
并希望使用SqlBuilder
,但我找不到任何可以使用SqlBuilder in .NET 3.5
的引用。这可能还是有替代方案?
我更改了dynamic keywords to object
并修改了ResolveClauses
看起来像这样(我刚刚将ToArray()添加到string.Join方法中):
public string ResolveClauses(DynamicParameters p)
{
foreach (var item in this)
{
p.AddDynamicParams(item.Parameters);
}
return this.Any(a => a.IsInclusive)
? prefix +
string.Join(joiner,
this.Where(a => !a.IsInclusive)
.Select(c => c.Sql)
.Union(new[]
{
" ( " +
string.Join(" OR ", this.Where(a => a.IsInclusive).Select(c => c.Sql).ToArray()) +
" ) "
}).ToArray()) + postfix
: prefix + string.Join(joiner, this.Select(c => c.Sql).ToArray()) + postfix;
}
ResolveClauses
之前看起来像这样:
public string ResolveClauses(DynamicParameters p)
{
foreach (var item in this)
{
p.AddDynamicParams(item.Parameters);
}
return this.Any(a => a.IsInclusive)
? prefix +
string.Join(joiner,
this.Where(a => !a.IsInclusive)
.Select(c => c.Sql)
.Union(new[]
{
" ( " +
string.Join(" OR ", this.Where(a => a.IsInclusive).Select(c => c.Sql).ToArray()) +
" ) "
})) + postfix
: prefix + string.Join(joiner, this.Select(c => c.Sql)) + postfix;
}
但我收到错误Can't convert IEnumerable<string> to string[]
#define CSHARP30
using System.Collections.Generic;
using System.Linq;
namespace Dapper
{
public class SqlBuilder
{
Dictionary<string, Clauses> data = new Dictionary<string, Clauses>();
int seq;
class Clause
{
public string Sql { get; set; }
public object Parameters { get; set; }
public bool IsInclusive { get; set; }
}
class Clauses : List<Clause>
{
string joiner;
string prefix;
string postfix;
#if CSHARP30
public Clauses(string joiner, string prefix, string postfix)
#else
public Clauses(string joiner, string prefix = "", string postfix = "")
#endif
{
this.joiner = joiner;
this.prefix = prefix;
this.postfix = postfix;
}
public string ResolveClauses(DynamicParameters p)
{
foreach (var item in this)
{
p.AddDynamicParams(item.Parameters);
}
return this.Any(a => a.IsInclusive)
? prefix +
string.Join(joiner,
this.Where(a => !a.IsInclusive)
.Select(c => c.Sql)
.Union(new[]
{
" ( " +
string.Join(" OR ", this.Where(a => a.IsInclusive).Select(c => c.Sql).ToArray()) +
" ) "
}).ToArray()) + postfix
: prefix + string.Join(joiner, this.Select(c => c.Sql).ToArray()) + postfix;
}
}
public class Template
{
readonly string sql;
readonly SqlBuilder builder;
readonly object initParams;
int dataSeq = -1; // Unresolved
#if CSHARP30
public Template(SqlBuilder builder, string sql, object parameters)
#else
public Template(SqlBuilder builder, string sql, dynamic parameters)
#endif
{
this.initParams = parameters;
this.sql = sql;
this.builder = builder;
}
static System.Text.RegularExpressions.Regex regex =
new System.Text.RegularExpressions.Regex(@"\/\*\*.+\*\*\/", System.Text.RegularExpressions.RegexOptions.Compiled | System.Text.RegularExpressions.RegexOptions.Multiline);
void ResolveSql()
{
if (dataSeq != builder.seq)
{
DynamicParameters p = new DynamicParameters(initParams);
rawSql = sql;
foreach (var pair in builder.data)
{
rawSql = rawSql.Replace("/**" + pair.Key + "**/", pair.Value.ResolveClauses(p));
}
parameters = p;
// replace all that is left with empty
rawSql = regex.Replace(rawSql, "");
dataSeq = builder.seq;
}
}
string rawSql;
object parameters;
public string RawSql { get { ResolveSql(); return rawSql; } }
public object Parameters { get { ResolveSql(); return parameters; } }
}
public SqlBuilder()
{
}
#if CSHARP30
public Template AddTemplate(string sql, object parameters)
#else
public Template AddTemplate(string sql, dynamic parameters = null)
#endif
{
return new Template(this, sql, parameters);
}
#if CSHARP30
void AddClause(string name, string sql, object parameters, string joiner, string prefix, string postfix, bool isInclusive)
#else
void AddClause(string name, string sql, object parameters, string joiner, string prefix = "", string postfix = "", bool isInclusive = false)
#endif
{
Clauses clauses;
if (!data.TryGetValue(name, out clauses))
{
clauses = new Clauses(joiner, prefix, postfix);
data[name] = clauses;
}
clauses.Add(new Clause { Sql = sql, Parameters = parameters, IsInclusive = isInclusive });
seq++;
}
#if CSHARP30
public SqlBuilder Intersect(string sql, object parameters)
#else
public SqlBuilder Intersect(string sql, dynamic parameters = null)
#endif
{
#if CSHARP30
AddClause("intersect", sql, parameters, "\nINTERSECT\n ", "\n ", "\n", false);
#else
AddClause("intersect", sql, parameters, joiner: "\nINTERSECT\n ", prefix: "\n ", postfix: "\n", isInclusive: false);
#endif
return this;
}
#if CSHARP30
public SqlBuilder InnerJoin(string sql, object parameters)
#else
public SqlBuilder InnerJoin(string sql, dynamic parameters = null)
#endif
{
#if CSHARP30
AddClause("innerjoin", sql, parameters, "\nINNER JOIN ", "\nINNER JOIN ", "\n", false);
#else
AddClause("innerjoin", sql, parameters, joiner: "\nINNER JOIN ", prefix: "\nINNER JOIN ", postfix: "\n", isInclusive: false);
#endif
return this;
}
#if CSHARP30
public SqlBuilder LeftJoin(string sql, object parameters)
#else
public SqlBuilder LeftJoin(string sql, dynamic parameters = null)
#endif
{
#if CSHARP30
AddClause("leftjoin", sql, parameters, "\nLEFT JOIN ", "\nLEFT JOIN ", "\n", false);
#else
AddClause("leftjoin", sql, parameters, joiner: "\nLEFT JOIN ", prefix: "\nLEFT JOIN ", postfix: "\n", isInclusive: false);
#endif
return this;
}
#if CSHARP30
public SqlBuilder RightJoin(string sql, object parameters)
#else
public SqlBuilder RightJoin(string sql, dynamic parameters = null)
#endif
{
#if CSHARP30
AddClause("rightjoin", sql, parameters, "\nRIGHT JOIN ", "\nRIGHT JOIN ", "\n", false);
#else
AddClause("rightjoin", sql, parameters, joiner: "\nRIGHT JOIN ", prefix: "\nRIGHT JOIN ", postfix: "\n", isInclusive: false);
#endif
return this;
}
#if CSHARP30
public SqlBuilder Where(string sql, object parameters)
#else
public SqlBuilder Where(string sql, dynamic parameters = null)
#endif
{
#if CSHARP30
AddClause("where", sql, parameters, " AND ", "WHERE ", "\n", false);
#else
AddClause("where", sql, parameters, " AND ", prefix: "WHERE ", postfix: "\n", isInclusive: false);
#endif
return this;
}
#if CSHARP30
public SqlBuilder OrWhere(string sql, object parameters)
#else
public SqlBuilder OrWhere(string sql, dynamic parameters = null)
#endif
{
#if CSHARP30
AddClause("where", sql, parameters, " AND ", "WHERE ", "\n", true);
#else
AddClause("where", sql, parameters, " AND ", prefix: "WHERE ", postfix: "\n", isInclusive: true);
#endif
return this;
}
#if CSHARP30
public SqlBuilder OrderBy(string sql, object parameters)
#else
public SqlBuilder OrderBy(string sql, dynamic parameters = null)
#endif
{
#if CSHARP30
AddClause("orderby", sql, parameters, " , ", "ORDER BY ", "\n", false);
#else
AddClause("orderby", sql, parameters, " , ", prefix: "ORDER BY ", postfix: "\n", isInclusive: false);
#endif
return this;
}
#if CSHARP30
public SqlBuilder Select(string sql, object parameters)
#else
public SqlBuilder Select(string sql, dynamic parameters = null)
#endif
{
#if CSHARP30
AddClause("select", sql, parameters, " , ", "", "\n", false);
#else
AddClause("select", sql, parameters, " , ", prefix: "", postfix: "\n", isInclusive: false);
#endif
return this;
}
#if CSHARP30
public SqlBuilder AddParameters(object parameters)
#else
public SqlBuilder AddParameters(dynamic parameters)
#endif
{
#if CSHARP30
AddClause("--parameters", "", parameters, "", "", "", false);
#else
AddClause("--parameters", "", parameters, joiner: "", prefix: "", postfix: "", isInclusive: false);
#endif
return this;
}
#if CSHARP30
public SqlBuilder Join(string sql, object parameters)
#else
public SqlBuilder Join(string sql, dynamic parameters = null)
#endif
{
#if CSHARP30
AddClause("join", sql, parameters, "\nJOIN ", "\nJOIN ", "\n", false);
#else
AddClause("join", sql, parameters, joiner: "\nJOIN ", prefix: "\nJOIN ", postfix: "\n", isInclusive: false);
#endif
return this;
}
#if CSHARP30
public SqlBuilder GroupBy(string sql, object parameters)
#else
public SqlBuilder GroupBy(string sql, dynamic parameters = null)
#endif
{
#if CSHARP30
AddClause("groupby", sql, parameters, " , ", "\nGROUP BY ", "\n", false);
#else
AddClause("groupby", sql, parameters, joiner: " , ", prefix: "\nGROUP BY ", postfix: "\n", isInclusive: false);
#endif
return this;
}
#if CSHARP30
public SqlBuilder Having(string sql, object parameters)
#else
public SqlBuilder Having(string sql, dynamic parameters = null)
#endif
{
#if CSHARP30
AddClause("having", sql, parameters, "\nAND ", "HAVING ", "\n", false);
#else
AddClause("having", sql, parameters, joiner: "\nAND ", prefix: "HAVING ", postfix: "\n", isInclusive: false);
#endif
return this;
}
}
}