1 using System;
2 using System.Collections.Generic;
3 using System.Data;
4 using System.Data.SQLite;
5 using System.IO;
6 using System.Linq;
7 using System.Reflection;
8 using System.Text;
9 using System.Threading.Tasks;
10 using System.Linq.Expressions;
11
12 public class Easyliter
13 {
14 private string _connstr = null;
15 public string message { get; set; }
16 public Easyliter(string connstr)
17 {
18 _connstr = connstr;
19 }
20
21 /// <summary>
22 /// 根据SQL查询
23 /// </summary>
24 /// <typeparam name="T"></typeparam>
25 /// <param name="sql"></param>
26 /// <param name="pars">例如 : new { id>0 }</param>
27 /// <returns>查询结果</returns>
28 public List<T> Select<T>(string sql, object pars)
29 {
30 var dt = GetDataTable(sql, Common.GetObjectToSQLiteParameter(pars));
31 var reval = Common.List<T>(dt);
32 return reval;
33 }
34
35 /// <summary>
36 /// 根据拉姆达表达示查询
37 /// </summary>
38 /// <typeparam name="T"></typeparam>
39 /// <param name="whereExpressions">查询表达示</param>
40 /// <returns></returns>
41 public List<T> Select<T>(params Expression<Func<T, bool>>[] whereExpressions) where T : new()
42 {
43
44 var tEntity = new T();
45 var type = tEntity.GetType();
46 string whereStr = string.Empty;
47 if (whereExpressions != null && whereExpressions.Length > 0)
48 {
49 foreach (var expression in whereExpressions)
50 {
51 if (expression.Body is BinaryExpression)
52 {
53 BinaryExpression be = ((BinaryExpression)expression.Body);
54 whereStr = " and " + Common.BinarExpressionProvider(be.Left, be.Right, be.NodeType);
55 }
56 }
57 }
58 string sql = string.Format("select * from {0} where 1=1 {1} ", type.Name, whereStr);
59 var dt = GetDataTable(sql);
60 var reval = Common.List<T>(dt);
61 return reval;
62 }
63
64
65 /// <summary>
66 /// 根据拉姆达表达示查询
67 /// </summary>
68 /// <typeparam name="T"></typeparam>
69 /// <param name="pageIndex"></param>
70 /// <param name="pageSize"></param>
71 /// <param name="pageCount"></param>
72 /// <param name="order">id asc 或者 id desc</param>
73 /// <param name="expressions"></param>
74 /// <returns></returns>
75 public List<T> SelectPage<T>(int pageIndex, int pageSize, ref int pageCount, string orderBy, params Expression<Func<T, bool>>[] expressions) where T : new()
76 {
77
78 var tEntity = new T();
79 var type = tEntity.GetType();
80 string whereStr = string.Empty;
81 foreach (var expression in expressions)
82 {
83 if (expression.Body is BinaryExpression)
84 {
85 BinaryExpression be = ((BinaryExpression)expression.Body);
86 whereStr =" and " + Common.BinarExpressionProvider(be.Left, be.Right, be.NodeType);
87 }
88 }
89 string sql = string.Format("select * from {0} where 1=1 {1} order by {2} LIMIT {3},{4} ", type.Name, whereStr, orderBy, (pageIndex - 1) * pageSize, pageSize);
90 string sqlCount = string.Format("select count(*) from {0} where 1=1 {1} order by {2} ", type.Name, whereStr, orderBy);
91
92 var dt = GetDataTable(sql);
93 pageCount = GetInt(sqlCount);
94 var reval = Common.List<T>(dt);
95 return reval;
96 }
97
98
99 /// <summary>
100 /// 创建类
101 /// </summary>
102 /// <param name="nameSpace">命名空间</param>
103 /// <param name="fullPath">生成类的存放物理目录</param>
104 /// <param name="tableNames">指定生成的表名,不填为生成所有表</param>
105 /// <returns>执行结果</returns>
106 public string CreateCalss(string nameSpace, string dirPath, params string[] tableNames)
107 {
108
109 StringBuilder reval = new StringBuilder();
110 if (nameSpace == null)
111 {
112 return "nameSpace不能为空";
113 }
114 if (dirPath == null)
115 {
116 return "DirPath不能为空";
117 }
118 if (!System.IO.Directory.Exists(dirPath))
119 {
120 return "找不到dicPath路径";
121 }
122
123 string sql = "select name from sqlite_master where type='table' order by name";
124 var dt = GetDataTable(sql);
125 if (dt == null || dt.Rows.Count == 0)
126 {
127 throw new Exception("数据库没有可生成的表!");
128 }
129 else
130 {
131 foreach (DataRow dr in dt.Rows)
132 {
133 string tableName = dr["name"].ToString();
134 if (!tableName.Contains("_old") && tableName != "sqlite_sequence")
135 {
136 if (tableNames.Length == 0 || tableNames.Contains(tableName))
137 {
138 string classsql = string.Format("select * from {0} Limit 1", tableName);
139 CreateCalssBySql(nameSpace, dirPath, tableName, classsql);
140 reval.AppendFormat("表【{0}】:创建成功!\r\n", tableName);
141 }
142 }
143 }
144 }
145 return reval.ToString();
146 }
147 /// <summary>
148 /// 根据SQL创建类
149 /// </summary>
150 /// <param name="nameSpace">命名空间</param>
151 /// <param name="fullPath">生成类的存放物理目录</param>
152 /// <param name="tableNames">指定生成的表名,不填为生成所有表</param>
153 /// <param name="classsql">sql语句</param>
154 public bool CreateCalssBySql(string nameSpace, string dirPath, string tableName, string classsql)
155 {
156 DataTable classSource = GetDataTable(classsql);
157 string classString = ClassGenerating.DataTableToClass(classSource, tableName, nameSpace);
158
159 string calssPath = string.Format("{0}\\{1}.cs", dirPath.TrimEnd('\\'), tableName);
160 if (!File.Exists(calssPath))
161 {
162 FileInfo file = new FileInfo(calssPath);
163 using (FileStream stream = file.Create())
164 {
165 using (StreamWriter writer = new StreamWriter(stream, Encoding.UTF8))
166 {
167 //写入字符串
168 writer.Write(classString);
169
170 //输出
171 writer.Flush();
172 }
173 }
174
175 }
176 System.IO.File.WriteAllText(calssPath, classString, Encoding.UTF8);
177 return true;
178 }
179
180 /// <summary>
181 /// 插入
182 /// 用法:
183 /// Product p = new Product()
184 /// {
185 /// category_id = 2,
186 /// sku = "sku",
187 /// title = "title"
188 /// };
189 /// e.Insert<Product>(p);
190 /// </summary>
191 /// <typeparam name="TEntity"></typeparam>
192 /// <param name="entity"></param>
193 /// <param name="isIdentity">主键是否为自增长,true可以不填,false必填</param>
194 /// <returns></returns>
195 public bool Insert<TEntity>(TEntity entity, bool isIdentity = true) where TEntity : class
196 {
197 Type type = entity.GetType();
198 var primaryKeyName = GetPrimaryKey(type);
199 List<SQLiteParameter> pars = new List<SQLiteParameter>();
200 //2.获得实体的属性集合
201 PropertyInfo[] props = type.GetProperties();
202
203 //实例化一个StringBuilder做字符串的拼接
204 StringBuilder sb = new StringBuilder();
205
206 sb.Append("insert into " + type.Name + " (");
207
208 //3.遍历实体的属性集合
209 foreach (PropertyInfo prop in props)
210 {
211 //EntityState,@EntityKey
212 if (isIdentity == false || (isIdentity && prop.Name != primaryKeyName))
213 {
214 //4.将属性的名字加入到字符串中
215 sb.Append(prop.Name + ",");
216 }
217 }
218 //**去掉最后一个逗号
219 sb.Remove(sb.Length - 1, 1);
220 sb.Append(" ) values(");
221
222 //5.再次遍历,形成参数列表"(@xx,@xx@xx)"的形式
223 foreach (PropertyInfo prop in props)
224 {
225 //EntityState,@EntityKey
226 if (isIdentity == false || (isIdentity && prop.Name != primaryKeyName))
227 {
228 sb.Append("@" + prop.Name + ",");
229 object val = prop.GetValue(entity, null);
230 if (val == null)
231 val = DBNull.Value;
232 pars.Add(new SQLiteParameter("@" + prop.Name, val));
233 }
234 }
235 //**去掉最后一个逗号
236 sb.Remove(sb.Length - 1, 1);
237 sb.Append(")");
238
239 var sql = sb.ToString();
240 var addRowCount = ExecuteNonQuery(sql, pars.ToArray());
241 message = string.Format("{0}行受影响", addRowCount);
242 return addRowCount > 0;
243
244 }
245
246
247 /// <summary>
248 /// 更新
249 /// 用法:
250 /// Update<ClassName>(new { name='小张',sex='男'},new {id=1})
251 /// </summary>
252 /// <typeparam name="TEntity">更新实体类型</typeparam>
253 public bool Update<TEntity>(object rowObj, object whereObj) where TEntity : class
254 {
255 if (rowObj == null) { message = "rowObj不能为空"; return false; };
256 if (whereObj == null) { message = "rowObj不能为空"; return false; };
257
258 using (SQLiteHelper db = new SQLiteHelper(_connstr))
259 {
260 Type type = typeof(TEntity);
261 string sql = string.Format(" update {0} set ", type.Name);
262 Dictionary<string, string> rows = Common.GetObjectToDictionary(rowObj);
263 foreach (var r in rows)
264 {
265 sql += string.Format(" {0} =@{0} ,", r.Key);
266 }
267 sql = sql.TrimEnd(',');
268 sql += string.Format(" where 1=1 ");
269 Dictionary<string, string> wheres = Common.GetObjectToDictionary(whereObj);
270 foreach (var r in wheres)
271 {
272 sql += string.Format(" and {0} =@{0}", r.Key);
273 }
274 List<SQLiteParameter> parsList = new List<SQLiteParameter>();
275 parsList.AddRange(rows.Select(c => new SQLiteParameter("@" + c.Key, c.Value)));
276 parsList.AddRange(wheres.Select(c => new SQLiteParameter("@" + c.Key, c.Value)));
277 var updateRowCount = db.ExecuteNonQuery(sql, parsList.ToArray());
278 message = string.Format("{0}行受影响", updateRowCount);
279 return updateRowCount > 0;
280 }
281 }
282
283 /// <summary>
284 /// 批量删除
285 /// 用法:
286 /// Delete<T>(new int[]{1,2,3})
287 /// 或者
288 /// Delete<T>(3)
289 /// </summary>
290 /// <param name="oc"></param>
291 /// <param name="whereIn">in的集合</param>
292 /// <param name="whereIn">主键为实体的第一个属性</param>
293 public bool Delete<TEntity>(params dynamic[] whereIn)
294 {
295 try
296 {
297 using (SQLiteHelper db = new SQLiteHelper(_connstr))
298 {
299
300 Type type = typeof(TEntity);
301 string key = type.FullName;
302 bool isSuccess = false;
303 if (whereIn != null && whereIn.Length > 0)
304 {
305 string sql = string.Format("delete from {0} where {1} in ({2})", type.Name, GetPrimaryKey(type), Common.ToJoinSqlInVal(whereIn));
306 int deleteRowCount = db.ExecuteNonQuery(sql);
307 message = string.Format("{0}行受影响", deleteRowCount);
308 isSuccess = deleteRowCount > 0;
309 }
310 return isSuccess;
311 }
312 }
313 catch (Exception ex)
314 {
315 throw ex;
316 }
317 }
318
319
320
321 /// <summary>
322 /// 该方法执行传入的增删改SQL语句
323 /// </summary>
324 /// <param name="sql"></param>
325 /// <returns>返回影响行数</returns>
326 public int ExecuteNonQuery(string sql, params SQLiteParameter[] pars)
327 {
328 using (SQLiteHelper db = new SQLiteHelper(_connstr))
329 {
330 return db.ExecuteNonQuery(sql, pars);
331 }
332 }
333
334 /// <summary>
335 /// 反回datatable
336 /// </summary>
337 /// <param name="sql"></param>
338 /// <returns></returns>
339 public DataTable GetDataTable(string sql, params SQLiteParameter[] pars)
340 {
341 using (SQLiteHelper db = new SQLiteHelper(_connstr))
342 {
343 return db.ExecuteQuery(sql, pars);
344 }
345 }
346
347 /// <summary>
348 /// 反回第一行第一列
349 /// </summary>
350 /// <param name="sql"></param>
351 /// <returns></returns>
352 public string GetString(string sql, params SQLiteParameter[] pars)
353 {
354 using (SQLiteHelper db = new SQLiteHelper(_connstr))
355 {
356 return db.GetString(sql, pars);
357 }
358 }
359 /// <summary>
360 /// 反回第一行第一列
361 /// </summary>
362 /// <param name="sql"></param>
363 /// <returns></returns>
364 public int GetInt(string sql, params SQLiteParameter[] pars)
365 {
366 using (SQLiteHelper db = new SQLiteHelper(_connstr))
367 {
368 return db.GetInt(sql, pars);
369 }
370 }
371
372
373 /// <summary>
374 /// 获取主键
375 /// </summary>
376 /// <param name="type"></param>
377 /// <param name="key"></param>
378 /// <returns></returns>
379 private string GetPrimaryKey(Type type)
380 {
381 return type.GetProperties()[0].Name;
382 }
383 }