1、让C#开发更简单抽象增删改让C#开发更简单,抽象增删改相信经常做一些MS,CRM 项目的童鞋非常有体会,大部分时间都是在复制和粘贴,大部分项目框架都是建一个三层,首先是DAL建一些增删改查,然后呢是BLL业务层再建一些增删改 查,然后UI层再调用增删改查,整个过程非常的繁琐,开发效率并不是很高,这种项目做久了之后,就非常的痛苦,非常的无聊。今天我给大家带来一个抽象出增 删改查的框架,相信有些大牛早就总结出来了,不喜勿喷哈,本人旨在分享。你再也不用写增删改查了,我给你抽象出来了!现在业界火了一种ORM 框架,那就是Dapper,我也是Dapper的粉丝之一,而我总结出来的框架也是基于Daaper
2、。下面是我的代码,首先是Dapper Helper类,数据库通用访问类(用Nuget工具先把Dapper类引用到NetUtility.Dapper.Core项目中去):NetUtility.Dapper.Core.DataBaseAccess.csusingSystem;usingSystem.Collections.Generic;usingSystem.Configuration;usingSystem.Data.SqlClient;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingDapper;using
3、System.Data;usingNetUtility.Entity;usingSystem.Reflection;namespaceNetUtility.Dapper.Core/数据库访问类/publicclassDataBaseAccesspublicstaticSqlConnectionCreateConnection()stringconnStr=ConfigurationManager.ConnectionStringsconnString.ConnectionString;SqlConnectionconn=newSqlConnection(connStr);conn.Open()
4、;returnconn;/执行增、删、改方法/publicstaticintExecute(stringsql,objectparms=null)using(IDbConnectionconn=CreateConnection()returnconn.Execute(sql,parms);/得到单行单列/publicstaticobjectExecuteScalar(stringsql,objectparms=null)using(IDbConnectionconn=CreateConnection()returnconn.ExecuteScalar(sql,parms);/单个数据集查询/p
5、ublicstaticListQuery(stringsql,Funcpre,objectparms=null)using(IDbConnectionconn=CreateConnection()returnconn.Query(sql,parms).Where(pre).ToList();/单个数据集查询/publicstaticListQuery(stringsql,objectparms=null)using(IDbConnectionconn=CreateConnection()returnconn.Query(sql,parms).ToList();/多个数据集查询/publicst
6、aticSqlMapper.GridReaderMultyQuery(stringsql,objectparms=null)using(IDbConnectionconn=CreateConnection()returnconn.QueryMultiple(sql,parms);/单个数据集查询/publicstaticTEntityFirstOrDefault(stringsql,Funcselector,objectparms=null)using(IDbConnectionconn=CreateConnection()returnconn.Query(sql,parms).Where(s
7、elector).FirstOrDefault(); 我把增删改查抽象出来了,少不了的就是SQL语句的生成,生成SQL语句,要么是映射,要么是反射,而我用的是反射,给一个Entity类,我读取他所有属性和字段,然后生成对应的SQL语句。 NetUtility.Dapper.Core.DataMapping.csusingSystem;usingSystem.Collections.Generic;usingSystem.Configuration;usingSystem.Linq;usingSystem.Reflection;usingSystem.Text;usingSystem.Threa
8、ding.Tasks;namespaceNetUtility.Dapper.CoreinternalclassDataMappingwhereTModel:class#region数据库类型+DataBaseType/数据库类型/publicstaticstringDataBaseTypegetstringstrType=ConfigurationManager.AppSettingsDataBaseType;if(!string.IsNullOrEmpty(strType)returnstrType;elsereturnstring.Empty;#endregion#region主键属性字段
9、+PrimaryKey/主键字段名称/publicstaticstringPrimaryKeygetTypet=typeof(TModel);TableInfoAttributetableInfo=t.GetCustomAttribute(typeof(TableInfoAttribute),true)asTableInfoAttribute;if(tableInfo!=null)/如果没有标识表信息特性,则通过表名向数据库中得到主键信息returntableInfo.PrimaryKey;elsestringtableName=TableName();returnDataBaseAccess
10、.ExecuteScalar(SELECTnameFROMSysColumnsWHEREid=Object_Id(+tableName+)andcolid=(selecttop1colidfromsysindexkeyswhereid=Object_Id(+tableName+).ToString();#endregion#region获取表名+TableName/获取表名/数据库表名前缀/publicstaticstringTableName(stringprev=)Typet=typeof(TModel);TableInfoAttributetableInfo=t.GetCustomAtt
11、ribute(typeof(TableInfoAttribute),true)asTableInfoAttribute;returntableInfo!=null?tableInfo.TableName:string.Concat(prev,t.Name);#endregion#regionSelect查询语句+GetQuerySql/Select查询语句/publicstaticstringGetQuerySql()StringBuildersql=newStringBuilder(select*from);sql.Append(TableName();returnsql.ToString(
12、);#endregion#regionInsert非Null属性的对象实例Sql语句+GetInsertSql/Insert非Null属性的对象实例Sql语句/publicstaticstringGetInsertSql(TModelmodel)StringBuildersql=newStringBuilder(insertinto);stringprops=Propertys(model);sql.Append(TableName();sql.Append();sql.Append(string.Join(,props);sql.Append()values();sql.Append(str
13、ing.Join(,props);sql.Append();selectIDENTITY);returnsql.ToString();#endregion#regionDeleteSql语句+GetDeleteSql/DeleteSql语句/publicstaticstringGetDeleteSql()returnstring.Format(deletefrom0where1inIdList,TableName(),PrimaryKey);#endregion#regionUpdate非Null属性的对象实例Sql语句+GetUpdateSql/Update非Null属性的对象实例Sql语句
14、/publicstaticstringGetUpdateSql(TModelmodel)StringBuildersql=newStringBuilder(update);stringprops=Propertys(model);sql.Append(TableName();sql.Append(set);foreach(stringpropNameinprops)sql.Append(propName+=+propName+,);sql.Remove(sql.Length-1,1);sql.Append(where+PrimaryKey+=Id);returnsql.ToString();#
15、endregion#region非主键且非Null属性集合+Propertys/非主键且非Null属性/publicstaticstringPropertys(TModelmodel)PropertyInfoprops=typeof(TModel).GetProperties();Listlist=newList();stringkey=PrimaryKey;if(props!=null&props.Length0)foreach(PropertyInfopropinprops)if(prop.GetValue(model,null)!=null&!prop.Name.Equals(key,S
16、tringComparison.OrdinalIgnoreCase)list.Add(prop.Name);returnlist.ToArray();#endregion代码中的TableInfoAttribute 类是我建一个属性特性类,用于标识表名和主键名称的特性类,假如Entity实体类上面没有标识主键名称,框架默认会用Entity类名作为表名,建议最好标识一下表名和主键名称。NetUtility.Dapper.Core.TableInfoAttribute.csusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceNetUtility.Da
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1