/
BaseActiveRecord.cs
127 lines (124 loc) · 5.49 KB
/
BaseActiveRecord.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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using Dapper;
namespace ActiveRecordDemo.ActiveRecords
{
public class BaseActiveRecord<T> where T : class, IActiveRecord, new()
{
private static string _connectionString = "Server=DESKTOP-2CK1IFD; Database=ActiveRecordPatternDb; Trusted_Connection=True;";
public T Save(T activeRecord)
{
T t = null;
using (SqlConnection conn = new SqlConnection(_connectionString))
{
conn.Open();
int rowEffected = conn.Execute(CreateInsertCommand(activeRecord.GetSchemaName()), activeRecord);
if (rowEffected > 0)
{
t = conn.QueryFirstOrDefault<T>(CreateFindQuery(activeRecord));
}
conn.Close();
}
return t;
}
public void Update(T activeRecord)
{
using (SqlConnection conn = new SqlConnection(_connectionString))
{
conn.Open();
conn.Execute(CreateUpdateCommand(activeRecord), activeRecord);
conn.Close();
}
}
public void Delete(T activeRecord)
{
using (SqlConnection conn = new SqlConnection(_connectionString))
{
conn.Open();
conn.Execute(CreateDeleteCommand(activeRecord), activeRecord);
conn.Close();
}
}
public static IEnumerable<T> Read()
{
IEnumerable<T> tList = null;
using (SqlConnection conn = new SqlConnection(_connectionString))
{
conn.Open();
tList = conn.Query<T>($"SELECT * FROM {new T().GetSchemaName()}.{typeof(T).Name}");
conn.Close();
}
return tList;
}
public static T FindById(int id)
{
T t = null;
var idInfo = GetColumnsWithValues(new T()).FirstOrDefault(t => t.Item1.ToLowerInvariant().Contains("id"));
string tableName = typeof(T).Name;
using (SqlConnection conn = new SqlConnection(_connectionString))
{
conn.Open();
string query =
$"SELECT * FROM {new T().GetSchemaName()}.{typeof(T).Name} WHERE {idInfo.Item1}={id}";
t = conn.QueryFirstOrDefault<T>(query);
conn.Close();
}
return t;
}
private string CreateFindQuery(T activeRecord)
{
var columnsWithValues = GetColumnsWithValues(activeRecord).Where(t => !t.Item1.ToLowerInvariant().Contains("id")).ToList();
string tableName = typeof(T).Name;
List<string> setClouseList = new List<string>();
for (int i = 0; i < columnsWithValues.Count; i++)
{
var columnsWithValue = columnsWithValues.ElementAt(i);
string value = columnsWithValue.Item3.Contains("int")
? columnsWithValue.Item2.ToString()
: $"'{columnsWithValue.Item2.ToString()}'";
setClouseList.Add($"{columnsWithValue.Item1}={value}");
}
return $"SELECT * FROM {activeRecord.GetSchemaName()}.{tableName} WHERE {string.Join(" AND ", setClouseList)}";
}
private string CreateInsertCommand(string schemaName)
{
string[] columns = GetColumnsExceptPK();
string tableName = typeof(T).Name;
return $"INSERT INTO {schemaName}.{tableName}({string.Join(",", columns)}) VALUES(@{string.Join(",@", columns)})";
}
private static List<Tuple<string, object, string>> GetColumnsWithValues(T activeRecord)
{
return typeof(T).GetProperties()
.Select(p => new Tuple<string, object, string>(p.Name, p.GetValue(activeRecord), p.PropertyType.Name.ToLowerInvariant())).ToList();
}
private string[] GetColumnsExceptPK()
{
return typeof(T).GetProperties().Select(p => p.Name).Where(p => !p.Contains("Id")).ToArray();
}
private string CreateUpdateCommand(T activeRecord)
{
var id = GetColumnsWithValues(activeRecord).FirstOrDefault(t => t.Item1.ToLowerInvariant().Contains("id"));
var columnsWithValues = GetColumnsWithValues(activeRecord).Where(t => !t.Item1.ToLowerInvariant().Contains("id")).ToList();
string tableName = typeof(T).Name;
List<string> setClouseList = new List<string>();
for (int i = 0; i < columnsWithValues.Count; i++)
{
var columnsWithValue = columnsWithValues.ElementAt(i);
string value = columnsWithValue.Item3.Contains("int")
? columnsWithValue.Item2.ToString()
: $"'{columnsWithValue.Item2.ToString()}'";
setClouseList.Add($"{columnsWithValue.Item1}={value}");
}
return $"UPDATE {activeRecord.GetSchemaName()}.{tableName} SET {string.Join(", ", setClouseList)} WHERE {id.Item1}={id.Item2.ToString()}";
}
private string CreateDeleteCommand(T activeRecord)
{
var id = GetColumnsWithValues(activeRecord).FirstOrDefault(t => t.Item1.ToLowerInvariant().Contains("id"));
string tableName = typeof(T).Name;
return $"DELETE FROM {activeRecord.GetSchemaName()}.{tableName} WHERE {id.Item1}={id.Item2.ToString()}";
}
}
}