-
-
Notifications
You must be signed in to change notification settings - Fork 507
/
Copy pathSqlResult.cs
105 lines (89 loc) · 2.68 KB
/
SqlResult.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
using System;
using System.Collections.Generic;
using System.Linq;
namespace SqlKata
{
public class SqlResult
{
public Query Query { get; set; }
public string RawSql { get; set; } = "";
public List<object> Bindings { get; set; } = new List<object>();
public SqlResult()
{
}
public string Sql
{
get
{
return Helper.ReplaceAll(RawSql, "?", x => "@p" + x);
}
}
public Dictionary<string, object> NamedBindings
{
get
{
var namedParams = new Dictionary<string, object>();
for (var i = 0; i < Bindings.Count; i++)
{
namedParams["p" + i] = Bindings[i];
}
return namedParams;
}
}
private static Type[] numberTypes = new Type[]
{
typeof(int),
typeof(long),
typeof(decimal),
typeof(double),
typeof(float),
typeof(short),
typeof(ushort),
typeof(ulong),
};
public override string ToString()
{
return Helper.ReplaceAll(RawSql, "?", i =>
{
if (i >= Bindings.Count)
{
throw new Exception($"Failed to retrieve a binding at the index {i}, the total bindings count is {Bindings.Count}");
}
var value = Bindings[i];
if (value == null)
{
return "NULL";
}
else if (numberTypes.Contains(value.GetType()))
{
return value.ToString();
}
else if (value is DateTime date)
{
return "'" + date.ToString("yyyy-MM-dd HH:mm:ss") + "'";
}
else if (value is bool vBool)
{
return vBool ? "true" : "false";
}
else if (value is Enum vEnum)
{
return ((int)value) + $" /* {vEnum} */";
}
// fallback to string
return "'" + value.ToString() + "'";
});
}
public static SqlResult operator +(SqlResult a, SqlResult b)
{
var sql = a.RawSql + ";" + b.RawSql;
var bindings = a.Bindings.Concat(b.Bindings).ToList();
var result = new SqlResult
{
RawSql = sql,
Bindings = bindings
};
return result;
}
}
}