zoukankan      html  css  js  c++  java
  • Dapper.Contrib拓展及数据库生成实体

    1.关于Dapper.Contrib

      Dapper.Contrib是Dapper的一个拓展类库,Dapper是一个轻量级ORM框架,这个不了解的请自行收集资料,本文主要讲讲,数据库生成实体,并通过实体进行CURD

    2.首先,我们了解下Dapper.Contrib需要实体的格式:

    using Dapper.Contrib.Extensions;
        [Table("StudentSet")]
        public partial class StudentSet
        {
        	[Key]
            public int Id { get; set; }
        	
            public string StudentName { get; set; }
        	
            public string LoginName { get; set; }
        	
            public string Password { get; set; }
        	
            public int Age { get; set; }
        	
            public string Sex { get; set; }
        	
            public string ClassID { get; set; }
        	
            public string RuleID { get; set; }
        	
            public string Status { get; set; }
        	
            public string UpdateTime { get; set; }
        	
            public string CreateTime { get; set; }
        }
    

      可以看出,这里,需要注明表名,主键字段,并需要引用Dapper.Contrib.Extensions;的命名空间

    3.通过EF来从数据库映射出实体

      在第二点中,我们发现,定义一个实体来符合Dapper.Contrib要求是非常麻烦的,那么,我们来看看如何利用EF框架生成

    (3.1)想要生成与数据库对应的实体,就要用到EF的DB First,首先右键你的项目,添加新建项,数据,选择ADO.NET 实体数据模型

    添加,来自数据库EF设计器,之后就是连接你的数据库,选择表/视图/存储过程/函数等,之后,我们就能生成一个与数据库对应的实体

    这是我随意创建的一个,我们看一下生成的实体,发现,没有数据库注释说明,也不符合Dapper.Contrib的需要

    那么,我们来改动Model2.tt这个文件,这里,需要下载一个文件,很小,十几k,GetSummery.ttinclude下载完了后,放到与edmx文件同级目录下:

    然后,在配置文件添加数据库连接字串:

    <add name="MyDbContext" connectionString="Data Source=yourserver;Initial Catalog=yourdatabase;Integrated Security=True;" providerName="System.Data.SqlClient" />
    

      改动这个文件:

    包含到我们的Model2.tt文件,这是个T4模板文件

    <#@ include file="GetSummery.ttinclude" #>

    搜索<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
    添加

    using System.ComponentModel.DataAnnotations;
    /// <summary>
    /// <#= getTableSummery(code.Escape(entity)) #>
    /// </summary>
    在之下
    搜索<#=codeStringGenerator.Property(edmProperty)#>
    添加
    /// <summary>
    /// <#= getColumnSummery(code.Escape(entity),code.Escape(edmProperty)) #>
    /// </summary>

    <#=entity.KeyMembers.Contains(edmProperty.Name)?"[Key]":""#>
    在上方
    保存

    这时候查看,嗯,我们的数据库字段说明已经出来了并且符合我们的Dapper.Contrib的需要,这时候可能会报错,前面说过,你需要using Dapper.Contrib.Extensions;

    然后,我们就可以愉快的使用Dapper.Contrib了,这里不多说,贴出我自己写的DapperHelper类

    using Dapper;
    using Dapper.Contrib.Extensions;
    using FK.Common;
    using FK.Data.Entities;
    using System;
    using System.Collections.Concurrent;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Common;
    using System.Data.SqlClient;
    using System.Linq;
    using System.Reflection;
    
    namespace FK.Web.Data
    {
        public class DapperHelper
        {
            public static IDbConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["DbConnString"].ConnectionString.DESDecrypt());
    
            private static readonly ConcurrentDictionary<RuntimeTypeHandle, IEnumerable<PropertyInfo>> KeyProperties = new ConcurrentDictionary<RuntimeTypeHandle, IEnumerable<PropertyInfo>>();
            private static readonly ConcurrentDictionary<RuntimeTypeHandle, IEnumerable<PropertyInfo>> TypeProperties = new ConcurrentDictionary<RuntimeTypeHandle, IEnumerable<PropertyInfo>>();
    
            #region 增添记录
    
            /// <summary>
            /// 添加一个实体
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="TableName"></param>
            /// <param name="fieldlist"></param>
            /// <param name="key"></param>
            /// <param name="o"></param>
            /// <returns></returns>
            public static int AddByEntity<T>(string TableName, string fieldlist, string key, object o)
            {
                string ColumnsName = string.Empty;
                //fildlist=="*"时,通过实体获取列名
                if (fieldlist.Trim().Equals("*") || string.IsNullOrEmpty(fieldlist))
                {
                    PropertyInfo[] plist = typeof(T).GetProperties();
                    string str = "";
                    foreach (PropertyInfo p in plist)
                    {
                        if (!p.PropertyType.IsGenericType && !p.Name.Equals(key))
                            str += p.Name + ",";
    
                    }
                    str = str.Substring(0, str.Length - 1);
                    fieldlist = str;
                }
                //根据列名拼接参数名
                string[] arrstr = fieldlist.Split(',');
                foreach (string s in arrstr)
                {
                    ColumnsName += "@" + s + ",";
                }
                ColumnsName = ColumnsName.Substring(0, ColumnsName.Length - 1);
                fieldlist = "(" + fieldlist + ")";
                string sql = "Insert into " + TableName + " " + fieldlist + " values (" + ColumnsName + ")";
                //执行插入
                var result = connection.Execute(sql, o);
                return result;
            }
    
            /// <summary>
            /// 添加一个实体
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="criteria"></param>
            /// <param name="o"></param>
            /// <returns></returns>
            public static int AddByEntity<T>(PageCriteria criteria, object o)
            {
                string ColumnsName = string.Empty;
                //fildlist=="*"时,通过实体获取列名
                if (criteria.Fields.Trim().Equals("*") || string.IsNullOrEmpty(criteria.Fields))
                {
                    PropertyInfo[] plist = typeof(T).GetProperties();
                    string str = "";
                    foreach (PropertyInfo p in plist)
                    {
                        if (!p.PropertyType.IsGenericType && !p.Name.Equals(criteria.PrimaryKey))
                            str += p.Name + ",";
    
                    }
                    str = str.Substring(0, str.Length - 1);
                    criteria.Fields = str;
                }
                //根据列名拼接参数名
                string[] arrstr = criteria.Fields.Split(',');
                foreach (string s in arrstr)
                {
                    ColumnsName += "@" + s + ",";
                }
                ColumnsName = ColumnsName.Substring(0, ColumnsName.Length - 1);
                criteria.Fields = "(" + criteria.Fields + ")";
                string sql = "Insert into " + criteria.TableName + " " + criteria.Fields + " values (" + ColumnsName + ")";
                //执行插入
                var result = connection.Execute(sql, o);
                return result;
            }
    
            /// <summary>
            /// 事务操作
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="sqllist"></param>
            /// <param name="objlist"></param>
            /// <returns></returns>
            public static int TranByEntity<T>(IList<string> sqllist, IList<T> objlist)
            {
                if (sqllist.Count != objlist.Count) return -100;    //参数数量不一致
                connection.Open();
                IDbTransaction transaction = connection.BeginTransaction();
                try
                {
                    for (int i = 0; i < sqllist.Count; i++)
                    {
                        connection.Execute(sqllist[i], objlist[i], transaction);
                    }
                    transaction.Commit();
                    return 1;
                }
                catch
                {
                    transaction.Rollback();
                    return -1;
                }
            }
    
            #endregion
    
            #region 更新记录
    
            /// <summary>
            /// 更新记录
            /// </summary>
            /// <param name="TableName">表名</param>
            /// <param name="UpdateString">更新的列和值</param>
            /// <param name="WhereString">条件</param>
            /// <param name="Parameters">参数对象</param>
            /// <returns></returns>
            public static int Update(string TableName, string UpdateString, string WhereString, object Parameters = null)
            {
                string sql = "update " + TableName + " set " + UpdateString + " where 1=1 " + WhereString;
                var result = connection.Execute(sql, Parameters);
                return result;
            }
    
            /// <summary>
            /// 更新记录
            /// </summary>
            /// <param name="criteria"></param>
            /// <param name="UpdateString"></param>
            /// <param name="Parameters"></param>
            /// <returns></returns>
            public static int Update(PageCriteria criteria,  object Parameters = null)
            {
                string sql = "update " + criteria.TableName + " set " + criteria.Fields + " where 1=1 " + criteria.Condition;
                var result = connection.Execute(sql, Parameters);
                return result;
            }
    
            /// <summary>
            /// 更新实体
            /// </summary>
            /// <typeparam name="T">实体类型</typeparam>
            /// <param name="newt">实体对象,主键不能缺少</param>
            /// <returns></returns>
            public static int UpdateEntity<T>(T newt)
            {
                string TableName = typeof(T).Name;
                PropertyInfo[] plist = typeof(T).GetProperties();
                var type = typeof(T);
                var keyProperties = KeyPropertiesCache(type).ToList();
                string condition = "";
                foreach (var item in keyProperties)
                {
                    if (!item.PropertyType.IsGenericType)
                        condition = item.Name + "=@" + item.Name + " and";
                }
                string field = "";
                foreach (PropertyInfo p in plist)
                {
                    if (!p.PropertyType.IsGenericType)
                        field += p.Name + ",";
                }
                field = field.Substring(0, field.Length - 1);
                condition = condition.Substring(0, condition.Length - 4);
                T oldt = GetModel<T>(TableName, field, "where 1=1 " + condition, newt);
                if (newt == null || oldt == null) return 0;
                if (newt.Equals(oldt)) return 0;
                string objVal1 = string.Empty;
                string objVal2 = string.Empty;
                string updatestr = "";
                foreach (PropertyInfo p in plist)
                {
                    objVal1 = p.GetValue(newt, null) == null ? string.Empty : p.GetValue(newt, null).ToString();
                    objVal2 = p.GetValue(oldt, null) == null ? string.Empty : p.GetValue(oldt, null).ToString();
                    if (objVal1 != objVal2)
                        updatestr += p.Name + "=@" + p.Name + ",";
                }
                updatestr = updatestr.Substring(0, updatestr.Length - 1);
                string sql = "update " + TableName + " set " + updatestr + " where 1=1 " + condition;
                var result = connection.Execute(sql, newt);
                return result;
            }
    
            /// <summary>
            /// 更新实体,需要旧的实体对象
            /// </summary>
            /// <typeparam name="T">实体类型</typeparam>
            /// <param name="oldt">旧的实体对象</param>
            /// <param name="newt">新的实体对象</param>
            /// <returns></returns>
            public static int UpdateEntity<T>(T oldt, T newt)
            {
                string TableName = typeof(T).Name;
                PropertyInfo[] plist = typeof(T).GetProperties();
                var type = typeof(T);
                var keyProperties = KeyPropertiesCache(type).ToList();
                if (newt == null || oldt == null) return 0;
                if (newt.Equals(oldt)) return 0;
                string objVal1 = string.Empty;
                string objVal2 = string.Empty;
                string updatestr = "";
                foreach (PropertyInfo p in plist)
                {
                    objVal1 = p.GetValue(newt, null) == null ? string.Empty : p.GetValue(newt, null).ToString();
                    objVal2 = p.GetValue(oldt, null) == null ? string.Empty : p.GetValue(oldt, null).ToString();
                    if (objVal1 != objVal2&& !p.PropertyType.IsGenericType)
                        updatestr += p.Name + "=@" + p.Name + ",";
                }
                updatestr = updatestr.Substring(0, updatestr.Length - 1);
                string condition = "";
                foreach (var item in keyProperties)
                {
                    if (!item.PropertyType.IsGenericType)
                        condition = item.Name + "=@" + item.Name + " and";
                }
                condition = condition.Substring(0, condition.Length - 4);
                string sql = "update " + TableName + " set " + updatestr + " where 1=1 " + condition;
                var result = connection.Execute(sql, newt);
                return result;
            }
    
            #endregion
    
            #region 删除记录
    
            /// <summary>
            /// 删除记录
            /// </summary>
            /// <param name="TableName">表名</param>
            /// <param name="WhereString">条件</param>
            /// <param name="Parameters">参数对象</param>
            /// <returns></returns>
            public static int Delete(string TableName, string WhereString, object Parameters = null)
            {
                string sql = "delete from " + TableName + " where 1=1 " + WhereString;
                var result = connection.Execute(sql, Parameters);
                return result;
            }
    
            /// <summary>
            /// 删除
            /// </summary>
            /// <param name="criteria"></param>
            /// <param name="Parameters"></param>
            /// <returns></returns>
            public static int Delete(PageCriteria criteria, object Parameters = null)
            {
                string sql = "delete from " + criteria.TableName + " where 1=1 " + criteria.Condition;
                var result = connection.Execute(sql, Parameters);
                return result;
            }
    
            #endregion
    
            #region 查询操作
    
            /// <summary>
            /// 查询返回DataSet
            /// </summary>
            /// <param name="TableName"></param>
            /// <param name="FieldString"></param>
            /// <param name="WhereString"></param>
            /// <param name="Parameters"></param>
            /// <returns></returns>
            public static DataSet QueryGetDS(string TableName, string FieldString, string WhereString, object Parameters = null)
            {
                DataSet ds = new XDataSet();
                string sql = "select " + FieldString + " from " + TableName + " where 1=1 " + WhereString;
                var result = connection.ExecuteReader(sql, Parameters);
                try
                {
                    ds.Load(result, LoadOption.OverwriteChanges, null, new DataTable[] { });
                }
                finally { result.Close(); }
                return ds;
            }
    
            /// <summary>
            /// 查询返回DataSet
            /// </summary>
            /// <param name="criteria"></param>
            /// <param name="Parameters"></param>
            /// <returns></returns>
            public static DataSet QueryGetDS(PageCriteria criteria, object Parameters = null)
            {
                DataSet ds = new XDataSet();
                string sql = "select " + criteria.Fields + " from " + criteria.TableName + " where 1=1 " + criteria.Condition;
                var result = connection.ExecuteReader(sql, Parameters);
                try
                {
                    ds.Load(result, LoadOption.OverwriteChanges, null, new DataTable[] { });
                }
                finally { result.Close(); }
                return ds;
            }
    
            /// <summary>
            /// 查询返回DataTable
            /// </summary>
            /// <param name="TableName"></param>
            /// <param name="FieldString"></param>
            /// <param name="WhereString"></param>
            /// <param name="Parameters"></param>
            /// <returns></returns>
            public static DataTable QueryGetDT(string TableName, string FieldString, string WhereString, object Parameters = null)
            {
                DataTable dt = new DataTable();
                string sql = "select " + FieldString + " from " + TableName + " where 1=1 " + WhereString;
                var result = connection.ExecuteReader(sql, Parameters);
                try
                {
                    dt.Load(result);
                }
                finally { result.Close(); }
                return dt;
            }
    
            /// <summary>
            /// 查询返回DataTable
            /// </summary>
            /// <param name="criteria"></param>
            /// <param name="Parameters"></param>
            /// <returns></returns>
            public static DataTable QueryGetDT(PageCriteria criteria, object Parameters = null)
            {
                DataTable dt = new DataTable();
                string sql = "select " + criteria.Fields + " from " + criteria.TableName + " where 1=1 " + criteria.Condition;
                var result = connection.ExecuteReader(sql, Parameters);
                try
                {
                    dt.Load(result);
                }
                finally { result.Close(); }
                return dt;
            }
    
            /// <summary>
            /// 查询查询返回list
            /// </summary>
            /// <param name="TableName"></param>
            /// <param name="FieldString"></param>
            /// <param name="WhereString"></param>
            /// <param name="Parameters"></param>
            /// <returns>对象集</returns>
            public static List<T> Query<T>(string TableName, string FieldString, string WhereString, object Parameters = null)
            {
                string sql = "select " + FieldString + " from " + TableName + " where 1=1 " + WhereString;
                var result = connection.Query<T>(sql, Parameters).ToList();
                return result;
            }
    
            /// <summary>
            /// 查询返回list
            /// </summary>
            /// <param name="criteria"></param>
            /// <param name="Parameters"></param>
            /// <returns></returns>
            public static List<T> Query<T>(PageCriteria criteria, object Parameters = null)
            {
                string sql = "select " + criteria.Fields + " from " + criteria.TableName + " where 1=1 " + criteria.Condition;
                var result = connection.Query<T>(sql, Parameters).ToList();
                return result;
            }
    
            /// <summary>
            /// 获取模型
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="TableName"></param>
            /// <param name="FieldString"></param>
            /// <param name="WhereString"></param>
            /// <param name="Parameters"></param>
            /// <returns></returns>
            public static T GetModel<T>(string TableName, string FieldString, string WhereString, object Parameters = null)
            {
                string sql = "select top 1 " + FieldString + " from " + TableName + " where 1=1 " + WhereString;
                var result = connection.Query<T>(sql, Parameters).FirstOrDefault();
                return result;
            }
    
            /// <summary>
            /// 获取模型
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="criteria"></param>
            /// <param name="Parameters"></param>
            /// <returns></returns>
            public static T GetModel<T>(PageCriteria criteria, object Parameters = null)
            {
                string sql = "select " + criteria.Fields + " from " + criteria.TableName + " where 1=1 " + criteria.Condition;
                var result = connection.Query<T>(sql, Parameters).FirstOrDefault();
                return result;
            }
    
            /// <summary>
            /// 获取实体通过实体
            /// </summary>
            /// <typeparam name="T">实体类型</typeparam>
            /// <param name="t">实体对象</param>
            /// <param name="condition">and field1=@field1 and field2=@field2</param>
            /// <returns></returns>
            public static T GetModel<T>(T t, string condition=null)
            {
                string TableName = typeof(T).Name;
                PropertyInfo[] plist = typeof(T).GetProperties();
                var type = typeof(T);
                var keyProperties = KeyPropertiesCache(type).ToList();
                if (string.IsNullOrEmpty(condition)){
                    foreach (var item in keyProperties)
                    {
                        if (!item.PropertyType.IsGenericType)
                             condition =" and " + item.Name + "=@" + item.Name ;
                    }
                }
                string field = "";
                foreach (PropertyInfo p in plist)
                {
                    if (!p.PropertyType.IsGenericType)
                        field += p.Name + ",";
                }
                field = field.Substring(0, field.Length - 1);
                string sql = "select top 1 " + field + " from " + TableName + " where 1=1 " + condition;
                var result = connection.Query<T>(sql, t).FirstOrDefault();
                return result;
            }
    
            /// <summary>
            /// 通用分页获取数据
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="criteria"></param>
            /// <param name="param"></param>
            /// <returns></returns>
            public static PageDataView<T> GetPageModelList<T>(PageCriteria criteria)
            {
                var p = new DynamicParameters();
                string proName = "Fgly_Public_Pagination";
                p.Add("TableName", criteria.TableName);
                p.Add("PrimaryKey", criteria.PrimaryKey);
                p.Add("Fields", criteria.Fields);
                p.Add("Filter", criteria.Condition);
                p.Add("CurrentPage", criteria.CurrentPage);
                p.Add("PageSize", criteria.PageSize);
                p.Add("Order", criteria.Sort);
                p.Add("TotalCount", dbType: DbType.Int32, direction: ParameterDirection.Output);
    
                connection.Open();
                var pageData = new PageDataView<T>
                {
                    Items = connection.Query<T>(proName, p, commandType: CommandType.StoredProcedure).ToList()
                };
                connection.Close();
                pageData.TotalNum = p.Get<int>("TotalCount");
                pageData.TotalPageCount = Convert.ToInt32(Math.Ceiling(pageData.TotalNum * 1.0 / criteria.PageSize));
                pageData.CurrentPage = criteria.CurrentPage > pageData.TotalPageCount ? pageData.TotalPageCount : criteria.CurrentPage;
                return pageData;
            }
    
            /// <summary>
            /// 分页获取数据
            /// </summary>
            /// <param name="criteria"></param>
            /// <param name="TotalCount"></param>
            /// <returns></returns>
            public static DataTable GetPageProc(PageCriteria criteria,ref int TotalCount)
            {
                var p = new DynamicParameters();
                string proName = "Fgly_Public_Pagination";
                p.Add("TableName", criteria.TableName);
                p.Add("PrimaryKey", criteria.PrimaryKey);
                p.Add("Fields", criteria.Fields);
                p.Add("Filter", criteria.Condition);
                p.Add("CurrentPage", criteria.CurrentPage);
                p.Add("PageSize", criteria.PageSize);
                p.Add("Order", criteria.Sort);
                p.Add("TotalCount", dbType: DbType.Int32, direction: ParameterDirection.Output);
                DataTable dt = new DataTable();
                //connection.Open();
                var result = connection.ExecuteReader(proName, p, commandType: CommandType.StoredProcedure);
                try
                {
                    dt.Load(result);
                }
                finally { result.Close(); }
                connection.Close();
                TotalCount = p.Get<int>("TotalCount");
                return dt;
            }
    
            /// <summary>
            /// 分页获取数据
            /// </summary>
            /// <param name="criteria"></param>
            /// <param name="TotalCount"></param>
            /// <returns></returns>
            public static IList<T> GetPageProc<T>(PageCriteria criteria, ref int TotalCount)
            {
                var p = new DynamicParameters();
                string proName = "Fgly_Public_Pagination";
                p.Add("TableName", criteria.TableName);
                p.Add("PrimaryKey", criteria.PrimaryKey);
                p.Add("Fields", criteria.Fields);
                p.Add("Filter", criteria.Condition);
                p.Add("CurrentPage", criteria.CurrentPage);
                p.Add("PageSize", criteria.PageSize);
                p.Add("Order", criteria.Sort);
                p.Add("TotalCount", dbType: DbType.Int32, direction: ParameterDirection.Output);
                connection.Open();
                var result = connection.Query<T>(proName, p, commandType: CommandType.StoredProcedure).ToList();
                connection.Close();
                TotalCount = p.Get<int>("TotalCount");
                return result;
            }
            #endregion
    
            #region 执行存储过程
            /// <summary>
            /// 执行存储过程并返回List
            /// </summary>
            /// <param name="proName"></param>
            /// <param name="p"></param>
            /// <returns></returns>
            public static List<T> ExtProcGetList<T>(string proName, object p = null)
            {
                var result = connection.Query<T>(proName, p, commandType: CommandType.StoredProcedure).ToList();
                return result;
            }
    
            /// <summary>
            /// 执行存储过程并返回DataSet
            /// </summary>
            /// <param name="proName"></param>
            /// <param name="p"></param>
            /// <returns></returns>
            public static DataSet ExtProcGetDS(string proName, object p=null)
            {
                DataSet ds = new XDataSet();
                var result = connection.ExecuteReader(proName, p, commandType: CommandType.StoredProcedure);
                try
                {
                    ds.Load(result, LoadOption.OverwriteChanges, null, new DataTable[] { });
                }
                finally { result.Close(); }
                return ds;
            }
    
            /// <summary>
            /// 执行存储过程并返回DataTable
            /// </summary>
            /// <param name="proName"></param>
            /// <param name="p"></param>
            /// <returns></returns>
            public static DataTable ExtProcGetDT(string proName, object p = null)
            {
                DataTable dt = new DataTable();
                var result = connection.ExecuteReader(proName, p, commandType: CommandType.StoredProcedure);
                try
                {
                    dt.Load(result);
                }
                finally { result.Close(); }
                return dt;
            }
    
            /// <summary>
            /// 执行存储过程返回受影响的行数
            /// </summary>
            /// <param name="proName"></param>
            /// <param name="p"></param>
            /// <returns></returns>
            public static int IntExtProc(string proName,object p = null)
            {
                int result = connection.Execute(proName, p, commandType: CommandType.StoredProcedure);
                return result;
            }
    
            /// <summary>
            /// 执行存储过程返回一个值
            /// </summary>
            /// <param name="proName"></param>
            /// <param name="p"></param>
            /// <returns></returns>
            public static object ExtProcScale(string proName, object p = null)
            {
                object result = connection.ExecuteScalar(proName, p, commandType: CommandType.StoredProcedure);
                return result;
            }
    
            #endregion
    
            #region 执行Sql语句
    
            /// <summary>
            /// 执行sql返回list
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="sql"></param>
            /// <param name="p"></param>
            /// <returns></returns>
            public static List<T> ExtSqlGetList<T>(string sql,object p = null)
            {
                var result = connection.Query<T>(sql, p).ToList();
                return result;
            }
    
            /// <summary>
            /// 执行Sql语句返回模型
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="sql"></param>
            /// <param name="parameter"></param>
            /// <returns></returns>
            public static T ExtSqlGetModel<T>(string sql, object parameter)
            {
                var result = connection.Query<T>(sql, parameter).ToList().FirstOrDefault();
                return result;
            }
    
            /// <summary>
            /// 执行sql返回DataSet
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="p"></param>
            /// <returns></returns>
            public static DataSet ExtSqlGetDS(string sql,object p = null)
            {
                DataSet ds = new XDataSet();
                var result = connection.ExecuteReader(sql, p);
                try
                {
                    ds.Load(result, LoadOption.OverwriteChanges, null, new DataTable[] { });
                }
                finally { result.Close(); }
                return ds;
            }
    
            /// <summary>
            /// 执行SQL返回DataTable
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="p"></param>
            /// <returns></returns>
            public static DataTable ExtSqlGetDT(string sql, object p = null)
            {
                DataTable dt = new DataTable();
                var result = connection.ExecuteReader(sql, p);
                try
                {
                    dt.Load(result);
                }
                finally { result.Close(); }
                return dt;
            }
    
            /// <summary>
            /// 执行SQL返回受影响的行数
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="p"></param>
            /// <returns></returns>
            public static int IntExtSql(string sql, object p = null)
            {
                int result = connection.Execute(sql, p);
                return result;
            }
    
            /// <summary>
            /// 执行SQL返回一个值
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="p"></param>
            /// <returns></returns>
            public static object ExtSqlScale(string sql,object p = null)
            {
                object result = connection.ExecuteScalar(sql, p);
                return result;
            }
            #endregion
    
            #region 扩展需要方法
            private static List<PropertyInfo> KeyPropertiesCache(Type type)
            {
                var allProperties = TypePropertiesCache(type);
                var keyProperties = allProperties.Where(p => p.GetCustomAttributes(true).Any(a => a is Dapper.Contrib.Extensions.KeyAttribute)).ToList();
    
                if (keyProperties.Count == 0)
                {
                    var idProp = allProperties.Find(p => string.Equals(p.Name, "id", StringComparison.CurrentCultureIgnoreCase));
                    if (idProp != null && !idProp.GetCustomAttributes(true).Any(a => a is ExplicitKeyAttribute))
                    {
                        keyProperties.Add(idProp);
                    }
                }
    
                KeyProperties[type.TypeHandle] = keyProperties;
                return keyProperties;
            }
    
            private static List<PropertyInfo> TypePropertiesCache(Type type)
            {
                var properties = type.GetProperties().Where(IsWriteable).ToArray();
                TypeProperties[type.TypeHandle] = properties;
                return properties.ToList();
            }
    
            private static bool IsWriteable(PropertyInfo pi)
            {
                var attributes = pi.GetCustomAttributes(typeof(WriteAttribute), false).AsList();
                if (attributes.Count != 1) return true;
    
                var writeAttribute = (WriteAttribute)attributes[0];
                return writeAttribute.Write;
            }
    
            #endregion
    
        }
    
        public class XLoadAdapter : DataAdapter
        {
            public XLoadAdapter()
            {
            }
    
            public int FillFromReader(DataSet ds, IDataReader dataReader, int startRecord, int maxRecords)
            {
                return this.Fill(ds, "Table", dataReader, startRecord, maxRecords);
            }
        }
    
        public class XDataSet : DataSet
        {
            public override void Load(IDataReader reader, LoadOption loadOption, FillErrorEventHandler handler, params DataTable[] tables)
            {
                XLoadAdapter adapter = new XLoadAdapter
                {
                    FillLoadOption = loadOption,
                    MissingSchemaAction = MissingSchemaAction.AddWithKey
                };
                if (handler != null)
                {
                    adapter.FillError += handler;
                }
                adapter.FillFromReader(this, reader, 0, 0);
                if (!reader.IsClosed && !reader.NextResult())
                {
                    reader.Close();
                }
            }
        }
    }
    

      这个类,包含了对实体操作,执行sql语句,执行存储过程,返回list<T>,DataSet,DataTable,int,object等操作,可能需要你手动添加一些引用,这边在贴出我的条件类,分页类,在这个类中有用到:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace FK.Data.Entities
    {
        public class PageCriteria
        {
            private string _TableName;
            /// <summary>
            /// 表名
            /// </summary>
            public string TableName
            {
                get { return _TableName; }
                set { _TableName = value; }
            }
            private string _Fileds = "*";
            /// <summary>
            /// 字段(逗号隔开,默认*)
            /// </summary>
            public string Fields
            {
                get { return _Fileds; }
                set { _Fileds = value; }
            }
            private string _PrimaryKey = "ID";
            /// <summary>
            /// 主键名
            /// </summary>
            public string PrimaryKey
            {
                get { return _PrimaryKey; }
                set { _PrimaryKey = value; }
            }
            private int _PageSize = 10;
            /// <summary>
            /// 每页记录数,默认10
            /// </summary>
            public int PageSize
            {
                get { return _PageSize; }
                set { _PageSize = value; }
            }
            private int _CurrentPage = 1;
            /// <summary>
            /// 当前页
            /// </summary>
            public int CurrentPage
            {
                get { return _CurrentPage; }
                set { _CurrentPage = value; }
            }
            private string _Sort = string.Empty;
            /// <summary>
            /// 排序
            /// </summary>
            public string Sort
            {
                get { return _Sort; }
                set { _Sort = value; }
            }
            private string _Condition = string.Empty;
            /// <summary>
            /// 条件
            /// </summary>
            public string Condition
            {
                get { return _Condition; }
                set { _Condition = value; }
            }
            private int _RecordCount;
            /// <summary>
            /// 记录数
            /// </summary>
            public int RecordCount
            {
                get { return _RecordCount; }
                set { _RecordCount = value; }
            }
        }
    }
    

      

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace FK.Data.Entities
    {
        public class PageDataView<T>
        {
            private int _TotalNum;
            public PageDataView()
            {
                this._Items = new List<T>();
            }
            /// <summary>
            /// 记录数
            /// </summary>
            public int TotalNum
            {
                get { return _TotalNum; }
                set { _TotalNum = value; }
            }
            private IList<T> _Items;
            /// <summary>
            /// 列表
            /// </summary>
            public IList<T> Items
            {
                get { return _Items; }
                set { _Items = value; }
            }
            /// <summary>
            /// 当前页
            /// </summary>
            public int CurrentPage { get; set; }
            /// <summary>
            /// 总页数,输出参数
            /// </summary>
            public int TotalPageCount { get; set; }
        } 
    }
    

      好了,还有什么疑问,或者建议,请在评论中与我讨论,感谢你的阅读,再见

  • 相关阅读:
    【设计模式】迭代器模式
    SpringMVC+Hibernate+Junit4+json基本框架近乎0配置
    Python
    Flex中TabNavigator隐藏和显示选项卡
    Android调试工具_ Stetho
    discuz的php7版本号
    分组加密的四种模式(ECB、CBC、CFB、OFB)
    人件札记:保持高效的办公室环境
    UVA 4857 Halloween Costumes 区间背包
    相机标定(Camera calibration)
  • 原文地址:https://www.cnblogs.com/CoderLinkf/p/8949509.html
Copyright © 2011-2022 走看看