Dapper.Contrib拓展及資料庫生成實體

来源:https://www.cnblogs.com/CoderLinkf/archive/2018/04/26/8949509.html
-Advertisement-
Play Games

dapper對實體操作,並返回DataSet和DataTable ...


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; }
    } 
}

  好了,還有什麼疑問,或者建議,請在評論中與我討論,感謝你的閱讀,再見


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一種啟動和檢測 UWP 應用的方法 背景 我們發佈過多款 UWP 平臺的同類型 App ,最近有一個需求:用傳統 Win32 程式啟動我們的 UWP 程式。因為我們的每一個UWP App在客戶機器上都是互斥的,也就是同時只能存在一個,並且我們的win32程式也只有一個版本,所以啟動 UWP App ...
  • qMISPlat是什麼? qMISPlat(業務配置開發平臺)是一套基於.net core 2.0、跨平臺的,面向開發人員和具有一 定技術水平的業務人員使用的業務配置開發平臺。基於此平臺您只需通過配置和少量開發即可快速 搭建滿足用戶需求的業務系統,大大降低項目開發工作量。平臺代碼100%開源,免費下 ...
  • 腳註和章節附註是對文本的補充說明。腳註一般位於頁面的底部,可以作為文檔某處內容的註釋;章節附註一般位於文檔的末尾,列出引文 的出處等。在本示例中將介紹如何來添加或刪除Word腳註。 工具使用: Free Spire. Doc for .NET(免費版) 第一步 :dll引用 第二步: 添加Word腳註、章節附註 ...
  • 根據一個Image的Url鏈接可以在瀏覽器中顯示一個圖片,如果要通過代碼將圖片保存在本地磁碟可以通過以下方式: 1、首先獲取圖片的二進位數組。 static public byte[] GetBytesFromUrl(string url) { byte[] b; HttpWebRequest my ...
  • 一、前言 今年開始安裝了VS2017,有時候需要使用到腳本編譯,奈何MS在VS2017上的腳本編譯上不再支持VS2015那種 "%VS140COMNTOOLS%vsvars32.bat",我真是服了。那麼沒辦法,我使用devenv總可以吧,於是我就寫了一段程式用於獲取最新版本VS的devenv。網上 ...
  • 首先聲明 這是讀了 愉悅的紳士 文章 《菜鳥之旅——學習線程(線程和線程池)》 《Task與線程》 的一些個人總結,還是那句話,如有不對,歡迎指正 文章以代碼加註釋的方法展示。 //線程的創建,阻塞和同步 //對方法加鎖 //線程池 //Task 任務 推薦使用任務來做多線程的,便於管理 ...
  • 前言:最近在做一個項目,需要使用ModBus RTU與PLC進行通訊,現在將使用過程記錄,以便備查。 一、什麼是ModBus通訊協議 Modbus協議是應用於電子控制器上的一種通用語言,此協議支持傳統的RS-232、RS-422、RS-485和乙太網設備。 ModBus功能碼 二、ModBus通訊協 ...
  • 網上已經有許多ASP.NET Core關於Widows IIS部署的文章,在部署到伺服器時遇到了一些問題,在這裡我就不再對原理進行闡釋(複製)了,只寫下一些關鍵環節,想看原理的同學請參考官網,此文章作為留用。 步驟: 1、ASP.NET Core程式內配置 2、Windows Server配置 一、 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...