让C#开发更简单抽象增删改.docx
《让C#开发更简单抽象增删改.docx》由会员分享,可在线阅读,更多相关《让C#开发更简单抽象增删改.docx(21页珍藏版)》请在冰豆网上搜索。
![让C#开发更简单抽象增删改.docx](https://file1.bdocx.com/fileroot1/2023-1/30/7b1269fb-5fe6-4478-8a0e-68adeda5cd7a/7b1269fb-5fe6-4478-8a0e-68adeda5cd7a1.gif)
让C#开发更简单抽象增删改
让C#开发更简单,抽象增删改
相信经常做一些MS,CRM项目的童鞋非常有体会,大部分时间都是在复制和粘贴,大部分项目框架都是建一个三层,首先是DAL建一些增删改查,然后呢是BLL业务层再建一些增删改查,然后UI层再调用增删改查,整个过程非常的繁琐,开发效率并不是很高,这种项目做久了之后,就非常的痛苦,非常的无聊。
今天我给大家带来一个抽象出增删改查的框架,相信有些大牛早就总结出来了,不喜勿喷哈,本人旨在分享。
你再也不用写增删改查了,我给你抽象出来了!
!
现在业界火了一种ORM框架,那就是Dapper,我也是Dapper的粉丝之一,而我总结出来的框架也是基于Daaper。
下面是我的代码,首先是DapperHelper类,数据库通用访问类(用Nuget工具先把Dapper类引用到NetUtility.Dapper.Core项目中去):
NetUtility.Dapper.Core.DataBaseAccess.cs
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Dapper;
using System.Data;
using NetUtility.Entity;
using System.Reflection;
namespace NetUtility.Dapper.Core
{
///
/// 数据库访问类
///
public class DataBaseAccess
{
public static SqlConnection CreateConnection()
{
string connStr = ConfigurationManager.ConnectionStrings["connString"].ConnectionString;
SqlConnection conn = new SqlConnection(connStr);
conn.Open();
return conn;
}
///
/// 执行增、删、改方法
///
///
///
///
public static int Execute(string sql, object parms = null)
{
using (IDbConnection conn = CreateConnection())
{
return conn.Execute(sql,parms);
}
}
///
/// 得到单行单列
///
///
///
///
public static object ExecuteScalar(string sql, object parms = null)
{
using (IDbConnection conn = CreateConnection())
{
return conn.ExecuteScalar(sql, parms);
}
}
///
/// 单个数据集查询
///
///
///
///
public static List Query(string sql,Func pre ,object parms = null)
{
using (IDbConnection conn = CreateConnection())
{
return conn.Query(sql, parms).Where(pre).ToList();
}
}
///
/// 单个数据集查询
///
///
///
///
public static List Query(string sql, object parms = null)
{
using (IDbConnection conn = CreateConnection())
{
return conn.Query(sql, parms).ToList();
}
}
///
/// 多个数据集查询
///
///
///
///
public static SqlMapper.GridReader MultyQuery(string sql, object parms = null)
{
using (IDbConnection conn = CreateConnection())
{
return conn.QueryMultiple(sql, parms);
}
}
///
/// 单个数据集查询
///
///
///
///
public static TEntity FirstOrDefault(string sql,Func selector, object parms = null)
{
using (IDbConnection conn = CreateConnection())
{
return conn.Query(sql, parms).Where(selector).FirstOrDefault();
}
}
}
}
我把增删改查抽象出来了,少不了的就是SQL语句的生成,生成SQL语句,要么是映射,要么是反射,而我用的是反射,给一个Entity类,我读取他所有属性和字段,然后生成对应的SQL语句。
NetUtility.Dapper.Core.DataMapping.cs
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace NetUtility.Dapper.Core
{
internal class DataMapping where TModel :
class
{
#region 数据库类型+DataBaseType
///
/// 数据库类型
///
public static string DataBaseType
{
get
{
string strType = ConfigurationManager.AppSettings["DataBaseType"];
if (!
string.IsNullOrEmpty(strType))
{
return strType;
}
else
{
return string.Empty;
}
}
}
#endregion
#region 主键属性字段+PrimaryKey
///
/// 主键字段名称
///
public static string PrimaryKey
{
get
{
Type t = typeof(TModel);
TableInfoAttribute tableInfo = t.GetCustomAttribute(typeof(TableInfoAttribute), true) as TableInfoAttribute;
if (tableInfo!
=null)//如果没有标识表信息特性,则通过表名向数据库中得到主键信息
{
return tableInfo.PrimaryKey;
}
else
{
string tableName = TableName();
return DataBaseAccess.ExecuteScalar("SELECT name FROM SysColumns WHERE id=Object_Id('" + tableName + "') and colid=(select top 1 colid from sysindexkeys where id=Object_Id('" + tableName + "'))").ToString();
}
}
}
#endregion
#region 获取表名+TableName
///
/// 获取表名
///
/// 数据库表名前缀
///
public static string TableName(string prev = "")
{
Type t = typeof(TModel);
TableInfoAttribute tableInfo = t.GetCustomAttribute(typeof(TableInfoAttribute), true) as TableInfoAttribute;
return tableInfo !
= null ?
tableInfo.TableName :
string.Concat(prev, t.Name);
}
#endregion
#region Select 查询语句+GetQuerySql
///
/// Select 查询语句
///
///
public static string GetQuerySql()
{
StringBuilder sql = new StringBuilder("select * from ");
sql.Append(TableName());
return sql.ToString();
}
#endregion
#region Insert非Null属性的对象实例 Sql 语句+GetInsertSql
///
/// Insert 非Null属性的对象实例 Sql 语句
///
///
///
public static string GetInsertSql(TModel model)
{
StringBuilder sql = new StringBuilder("insert into ");
string[] props = Propertys(model);
sql.Append(TableName());
sql.Append("(");
sql.Append(string.Join(",", props));
sql.Append(") values(@");
sql.Append(string.Join(",@", props));
sql.Append(");select @@IDENTITY");
return sql.ToString();
}
#endregion
#region Delete Sql 语句+GetDeleteSql
///
/// Delete Sql 语句
///
///
public static string GetDeleteSql()
{
return string.Format(@"delete from {0} where {1} in @IdList", TableName(), PrimaryKey);
}
#endregion
#region Update 非Null属性的对象实例 Sql语句+GetUpdateSql
///
/// Update 非Null属性的对象实例 Sql语句
///
///
///
public static string GetUpdateSql(TModel model)
{
StringBuilder sql = new StringBuilder("update ");
string[] props = Propertys(model);
sql.Append(TableName());
sql.Append(" set ");
foreach (string propName in props)
{
sql.Append(propName + "=@" + propName + ",");
}
sql.Remove(sql.Length - 1, 1);
sql.Append(" where " + PrimaryKey + "=@Id");
return sql.ToString();
}
#endregion
#region 非主键且非Null属性集合+Propertys
///
/// 非主键且非Null属性
///
///
///
public static string[] Propertys(TModel model)
{
PropertyInfo[] props = typeof(TModel).GetProperties();
List list = new List();
string key = PrimaryKey;
if (props !
= null && props.Length > 0)
{
foreach (PropertyInfo prop in props)
{
if (prop.GetValue(model, null) !
= null && !
prop.Name.Equals(key, StringComparison.OrdinalIgnoreCase))
{
list.Add(prop.Name);
}
}
}
return list.ToArray();
}
#endregion
}
}
代码中的TableInfoAttribute类是我建一个属性特性类,用于标识表名和主键名称的特性类,假如Entity实体类上面没有标识主键名称,框架默认会用Entity类名作为表名,建议最好标识一下表名和主键名称。
NetUtility.Dapper.Core.TableInfoAttribute.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NetUtility.Da