zoukankan      html  css  js  c++  java
  • .net5

    Dapper框架 个人的一点体会
    • 尽可能的保证数据库【字段名】和类【属性名】的一致性,不然需要多写很多的代码,说多了都是泪泪泪
    • 如果因为遵循了mysql数据库的建表规则【阿里的规则】,表名字段名带下划线的,使用As方式,其他方式自行探索
    Dapper框架 分页模型

    using System;
    using System.Collections.Generic;
    
    namespace NetFive.Repository
    {
        /// <summary>
        /// 分页模型
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public class PageDataView<T>
        {
            /// <summary>
            /// 当前第几页
            /// </summary>
            public int PageIndex { get; set; }
    
            /// <summary>
            /// 每页多少条数据
            /// </summary>
            public int PageSize { get; set; }
    
            /// <summary>
            /// 总共多少条数据
            /// </summary>
            public int TotalCount { get; set; }
    
            /// <summary>
            /// 总页数
            /// </summary>
            public int TotalPages => Convert.ToInt32(Math.Ceiling((double)TotalCount / PageSize));
    
            /// <summary>
            /// 数据
            /// </summary>
            public IList<T> Items { get; set; }
        }
    }
    

     分页ResponseDto:

    using NetFive.Repository;
    
    namespace NetFive.Service.Common
    {
        public class PageResponseDto<T> : ResponseDto where T : class
        {
            /// <summary>
            /// 分页数据
            /// </summary>
            public PageDataView<T> Data { get; set; }
        }
    }
    

      

    Dapper框架 数据库上下文【IDbContext】 MySql

    NuGet包:

    Microsoft.Extensions.Configuration
    MySql.Data
    

     目录结构:

    using System;
    using System.Data;
    
    namespace NetFive.Repository.interfaces
    {
        public interface IDbContext : IDisposable
        {
            /// <summary>
            /// 数据库链接对象
            /// </summary>
            IDbConnection Connection { get; }
        }
    }
    

     

    using Microsoft.Extensions.Configuration;
    using MySql.Data.MySqlClient;
    using NetFive.Repository.interfaces;
    using System.Data;
    
    namespace NetFive.Repository
    {
        public class DbContext : IDbContext
        {
            /// <summary>
            /// 链接字符串
            /// </summary>
            private string _connectionString;
    
            public DbContext(IConfiguration configuration)
            {
                _connectionString = configuration["AppSetting:ConnectionString"];
            }
    
            /// <summary>
            /// 链接对象
            /// </summary>
            private IDbConnection _connection;
    
            /// <summary>
            /// 获取链接
            /// </summary>
            public IDbConnection Connection
            {
                get 
                {
                    if (_connection == null)
                    {
                        _connection = new MySqlConnection(_connectionString);
                    }
                    if (_connection.State != ConnectionState.Open)
                    {
                        _connection.Open();
                    }
                    return _connection;
                }
            }
    
            /// <summary>
            /// 释放链接
            /// </summary>
            public void Dispose()
            {
                if (_connection != null && _connection.State == ConnectionState.Open)
                {
                    _connection.Close();
                }
            }
        }
    }
    

      

     Dapper框架 仓库【Repository】与UnitOfWorks合并:放弃Dapper原生的增删改方法,采用自己生成sql语句或者直接写语句的方式

     安装NuGet包:

    Dapper
    Dapper.Contrib
    

     自定义类: 

     字段映射

    using System;
    
    namespace CustomAttributes.Repository.Custom
    {
        /// <summary>
        /// 字段映射
        /// @Name 当数据库名与字段名不一致时
        /// </summary>
        public class ColumnAttribute : Attribute
        {
            /// <summary>
            /// 字段名不同时的映射
            /// </summary>
            public string Name { get; set; }
    
            public ColumnAttribute(string name)
            {
                Name = name;
            }
        }
    }
    

     仅查询字段

    using System;
    
    namespace CustomAttributes.Repository.Custom
    {
        /// <summary>
        /// 仅用作查询字段,不做增删改操作
        /// </summary>
        public class OnlyQueryAttribute : Attribute
        { }
    }
    

     主键,主键名,是否自增长 

    using System;
    
    namespace CustomAttributes.Repository.Custom
    {
        /// <summary>
        /// 主键特性 
        /// @Name 主键字段名
        /// @IsAutoIncrement 是否自增长主键
        /// </summary>
        public class PrimaryKeyAttribute : Attribute
        {
            /// <summary>
            /// 是否自增主键
            /// </summary>
            public bool IsAutoIncrement { get; }
    
            /// <summary>
            /// 主键字段
            /// </summary>
            public string Name { get; }
    
            public PrimaryKeyAttribute(string name, bool isAutoIncrement)
            {
                Name = name;
                IsAutoIncrement = isAutoIncrement;
            }
        }
    }
    

      

    接口:

    using CustomAttributes.Repository.Custom;
    using System.Collections.Generic;
    using System.Data;
    using static Dapper.SqlMapper;
    
    namespace CustomAttributes.Repository.interfaces
    {
        /// <summary>
        /// 数据库CRUD操作
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public interface IRepository<T> where T : class
        {
            /// <summary>
            /// 上下文
            /// </summary>
            IDbContext Context { get; }
            /// <summary>
            /// 链接
            /// </summary>
            IDbConnection Connection { get; }
    
            #region Add
            /// <summary>
            /// 添加:根据实体生成sql语句
            /// </summary>
            /// <param name="entity"></param>
            /// <param name="transaction"></param>
            /// <returns></returns>
            int Add(T entity, IDbTransaction transaction = null);
            /// <summary>
            /// 批量添加:根据实体生成sql语句
            /// </summary>
            /// <param name="list"></param>
            /// <param name="transaction"></param>
            /// <returns></returns>
            int BatchAdd(IList<T> list, IDbTransaction transaction = null);
            /// <summary>
            /// 添加:自己手写sql语句
            /// </summary>
            /// <param name="p_sql"></param>
            /// <param name="param"></param>
            /// <param name="transaction"></param>
            /// <returns></returns>
            int Add(string p_sql, object param = null, IDbTransaction transaction = null);
            /// <summary>
            /// 批量添加:自己手写sql语句
            /// </summary>
            /// <param name="p_sql"></param>
            /// <param name="param"></param>
            /// <param name="transaction"></param>
            /// <returns></returns>
            int BatchAdd(string p_sql, object param = null, IDbTransaction transaction = null);
            #endregion
    
            #region Update
            /// <summary>
            /// 修改:根据实体生成sql语句
            /// </summary>
            /// <param name="entity"></param>
            /// <param name="transaction"></param>
            /// <returns></returns>
            bool Update(T entity, IDbTransaction transaction = null);
            /// <summary>
            /// 修改:自己手写sql语句
            /// </summary>
            /// <param name="p_sql"></param>
            /// <param name="param"></param>
            /// <param name="transaction"></param>
            /// <returns></returns>
            bool Update(string p_sql, object param = null, IDbTransaction transaction = null);
            #endregion
    
            #region Delete
            /// <summary>
            /// 删除:根据主键删除
            /// </summary>
            /// <param name="key"></param>
            /// <param name="transaction"></param>
            /// <returns></returns>
            bool DeleteByKey(object key, IDbTransaction transaction = null);
            /// <summary>
            /// 根据By条件
            /// </summary>
            /// <param name="p_sql"></param>
            /// <param name="param"></param>
            /// <param name="transaction"></param>
            /// <returns></returns>
            bool Delete(string p_sql, object param = null, IDbTransaction transaction = null);
            #endregion
    
            #region Get
            /// <summary>
            /// 全部字段:主键
            /// </summary>
            /// <param name="key"></param>
            /// <param name="transaction"></param>
            /// <returns></returns>
            T GetByKey(object key, IDbTransaction transaction = null);
            /// <summary>
            /// 固定字段sql
            /// </summary>
            /// <param name="p_sql"></param>
            /// <param name="param"></param>
            /// <param name="transaction"></param>
            /// <returns></returns>
            T Get(string p_sql, object param = null, IDbTransaction transaction = null);
            /// <summary>
            /// 全部字段where
            /// </summary>
            /// <param name="where"></param>
            /// <param name="param"></param>
            /// <param name="transaction"></param>
            /// <returns></returns>
            T GetBy(string where, object param = null, IDbTransaction transaction = null);
            /// <summary>
            /// 固定字段sql
            /// </summary>
            /// <typeparam name="U"></typeparam>
            /// <param name="p_sql"></param>
            /// <param name="param"></param>
            /// <param name="transaction"></param>
            /// <returns></returns>
            U Get<U>(string p_sql, object param = null, IDbTransaction transaction = null);
            #endregion
    
            #region List
            /// <summary>
            /// 获取所有数据
            /// </summary>
            /// <param name="transaction"></param>
            /// <returns></returns>
            IList<T> ListAll(IDbTransaction transaction = null);
            /// <summary>
            /// 固定字段:单表数据sql
            /// </summary>
            /// <param name="p_sql"></param>
            /// <param name="param"></param>
            /// <param name="transaction"></param>
            /// <returns></returns>
            IList<T> List(string p_sql, object param = null, IDbTransaction transaction = null);
            /// <summary>
            /// 全部字段:单表数据where
            /// </summary>
            /// <param name="where"></param>
            /// <param name="param"></param>
            /// <param name="transaction"></param>
            /// <returns></returns>
            IList<T> ListBy(string where, object param = null, IDbTransaction transaction = null);
            /// <summary>
            /// 固定字段:多表数据sql
            /// </summary>
            /// <typeparam name="U"></typeparam>
            /// <param name="p_sql"></param>
            /// <param name="param"></param>
            /// <param name="transaction"></param>
            /// <returns></returns>
            IList<U> List<U>(string p_sql, object param = null, IDbTransaction transaction = null);
            #endregion
    
            #region IsExists
            /// <summary>
            /// 是否存在数据
            /// </summary>
            /// <param name="where"></param>
            /// <param name="param"></param>
            /// <param name="transaction"></param>
            /// <returns></returns>
            bool IsExists(string where, object param = null, IDbTransaction transaction = null);
            /// <summary>
            /// 是否存在数据【其他实体类方法调用的时候】
            /// </summary>
            /// <param name="where"></param>
            /// <param name="param"></param>
            /// <param name="transaction"></param>
            /// <returns></returns>
            bool IsExists<U>(string where, object param = null, IDbTransaction transaction = null);
            #endregion
    
            #region ListPaging
            /// <summary>
            /// 单表或多表分页,固定字段
            /// </summary>
            /// <typeparam name="U"></typeparam>
            /// <param name="pageIndex"></param>
            /// <param name="pageSize"></param>
            /// <param name="p_sqls"></param>
            /// <param name="param"></param>
            /// <param name="transaction"></param>
            /// <returns></returns>
            PageDataView<U> GetPageList<U>(int pageIndex, int pageSize, IList<string> p_sqls, object param = null, IDbTransaction transaction = null);
            /// <summary>
            /// 单表分页,返回单表全部字段
            /// </summary>
            /// <typeparam name="U"></typeparam>
            /// <param name="pageIndex"></param>
            /// <param name="pageSize"></param>
            /// <param name="where"></param>
            /// <param name="param"></param>
            /// <param name="transaction"></param>
            /// <returns></returns>
            PageDataView<U> GetPageListBy<U>(int pageIndex, int pageSize, string where, object param = null, IDbTransaction transaction = null);
            #endregion
    
            #region Excute / ExecuteScalar
            /// <summary>
            /// 执行sql
            /// </summary>
            /// <param name="p_sql"></param>
            /// <param name="transaction"></param>
            /// <returns></returns>
            int Excute(string p_sql, object param = null, IDbTransaction transaction = null);
            /// <summary>
            /// 获取单个参数
            /// </summary>
            /// <param name="p_sql"></param>
            /// <param name="param"></param>
            /// <param name="transaction"></param>
            /// <returns></returns>
            object ExecuteScalar(string p_sql, object param = null, IDbTransaction transaction = null);
            /// <summary>
            /// 获取单个参数
            /// </summary>
            /// <typeparam name="U"></typeparam>
            /// <param name="p_sql"></param>
            /// <param name="param"></param>
            /// <param name="transaction"></param>
            /// <returns></returns>
            U ExecuteScalar<U>(string p_sql, object param = null, IDbTransaction transaction = null);
            #endregion
    
            #region GridReader
            /// <summary>
            /// 多对象查询 var invoice = multi.Read<Invoice>().First(); var invoiceItems = multi.Read<InvoiceItem>().ToList();
            /// </summary>
            /// <param name="p_sql"></param>
            /// <param name="param"></param>
            /// <param name="transaction"></param>
            /// <param name="commandTimeout"></param>
            /// <param name="commandType"></param>
            /// <returns></returns>
            GridReader QueryMultiple(string p_sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null);
            #endregion
        }
    }
    

     实现:

    using CustomAttributes.Repository.Custom;
    using CustomAttributes.Repository.interfaces;
    using Dapper;
    using Dapper.Contrib.Extensions;
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    
    namespace CustomAttributes.Repository
    {
        public class Repository<T> : IRepository<T> where T : class
        {
            public IDbContext Context { get; }
    
            public Repository(IDbContext context)
            {
                Context = context;
            }
    
            public IDbConnection Connection => Context.Connection;
    
            #region 表名、主键字段名
            /// <summary>
            /// 表名
            /// </summary>
            public string TableName
            {
                get
                {
                    Type type = typeof(T);
                    var tableName = type.Name;
                    var at = type.GetCustomAttribute<TableAttribute>();
                    if (!string.IsNullOrWhiteSpace(at.Name))
                    {
                        tableName = at.Name;
                    }
                    return tableName;
                }
            }
            /// <summary>
            /// 主键字段
            /// </summary>
            public string PrimaryKeyName
            {
                get
                {
                    Type type = typeof(T);
                    string keyName = string.Empty;
                    var primaryKey = type.GetCustomAttribute<PrimaryKeyAttribute>();
                    if (primaryKey != null)
                    {
                        keyName = primaryKey.Name;
                    }
                    if (string.IsNullOrEmpty(keyName))
                    {
                        throw new Exception($"请设置实体类{type.Name}的PrimaryKey特性");
                    }
                    return keyName;
                }
            }
            /// <summary>
            /// 是否自增主键
            /// </summary>
            public bool IsAutoIncrement
            {
                get
                {
                    Type type = typeof(T);
                    var primaryKey = type.GetCustomAttribute<PrimaryKeyAttribute>();
                    if (primaryKey == null)
                    {
                        throw new Exception($"请设置实体类{type.Name}的PrimaryKey特性");
                    }
                    else
                    { 
                        return primaryKey.IsAutoIncrement;
                    }
                }
            }
            #endregion
    
            #region 根据反射生成sql语句
            /// <summary>
            /// 生成添加语句
            /// </summary>
            /// <returns></returns>
            private string InsertSql()
            {
                Type t = typeof(T);
                StringBuilder p_sql = new StringBuilder();
                var ps = t.GetProperties();
                IList<string> field = new List<string>();
                IList<string> param = new List<string>();
                foreach (var p in ps)
                {
                    //仅查询字段不在其内
                    var only = p.GetCustomAttribute<OnlyQueryAttribute>();
                    if (only != null)
                    {
                        continue;
                    }
                    string name = p.Name;
                    var column = p.GetCustomAttribute<ColumnAttribute>();
                    if (column != null)
                    {
                        name = column.Name;
                    }
                    if (name.ToUpper() == PrimaryKeyName.ToUpper() && IsAutoIncrement)
                    {
                        continue;
                    }
                    param.Add("@" + p.Name);
                    field.Add(name);
                }
                p_sql.Append($"insert into {TableName}({string.Join(",", field)}) values({string.Join(",", param)});");
                return p_sql.ToString();
            }
            /// <summary>
            /// 生成修改语句
            /// </summary>
            /// <returns></returns>
            private string UpdateSql()
            {
                Type t = typeof(T);
                StringBuilder p_sql = new StringBuilder();
                var ps = t.GetProperties();
                string keyName = string.Empty;
                IList<string> field = new List<string>();
                foreach (var p in ps)
                {
                    //仅查询字段不在修改
                    var only = p.GetCustomAttribute<OnlyQueryAttribute>();
                    if (only != null)
                    {
                        continue;
                    }
                    string name = p.Name;
                    var column = p.GetCustomAttribute<ColumnAttribute>();
                    if (column != null)
                    {
                        name = column.Name;
                    }
                    if (name.ToUpper() == PrimaryKeyName.ToUpper())
                    {
                        keyName = name;
                        continue;
                    }
                    field.Add($"{name}=@{p.Name}");
                }
                p_sql.Append($"update {TableName} set {string.Join(", ", field)} where {PrimaryKeyName} = @{keyName};");
                return p_sql.ToString();
            }
            #endregion
    
            #region Add
            public int Add(T entity, IDbTransaction transaction = null)
            {
                string p_sql = InsertSql();
                int result;
                if (IsAutoIncrement)
                {
                    p_sql += "SELECT LAST_INSERT_ID();";
                    result = Connection.ExecuteScalar<int>(p_sql, entity, transaction);
                }
                else
                {
                    result = Connection.Execute(p_sql, entity, transaction);
                }
                return result;
            }
    
            public int Add(string p_sql, object param = null, IDbTransaction transaction = null)
            {
                int result;
                if (IsAutoIncrement)
                {
                    p_sql += "SELECT LAST_INSERT_ID();";
                    result = Connection.ExecuteScalar<int>(p_sql, param, transaction);
                }
                else
                {
                    result = Connection.Execute(p_sql, param, transaction);
                }
                return result;
            }
    
            public int BatchAdd(IList<T> list, IDbTransaction transaction = null)
            {
                string p_sql = InsertSql();
                int result = Connection.Execute(p_sql, list, transaction);
                return result;
            }
    
            public int BatchAdd(string p_sql, object param = null, IDbTransaction transaction = null)
            {
                int result = Connection.Execute(p_sql, param, transaction);
                return result;
            }
            #endregion
    
            #region Update
            public bool Update(T entity, IDbTransaction transaction = null)
            {
                string p_sql = UpdateSql();
                int result = Connection.Execute(p_sql, entity, transaction);
                return result > 0;
            }
    
            public bool Update(string p_sql, object param = null, IDbTransaction transaction = null)
            {
                int result = Connection.Execute(p_sql, param, transaction);
                return result > 0;
            }
            #endregion
    
            #region Delete
            public bool DeleteByKey(object key, IDbTransaction transaction = null)
            {
                string p_sql = $"delete from {TableName} where {PrimaryKeyName} = @key;";
                int result = Connection.Execute(p_sql, new { key }, transaction);
                return result > 0;
            }
    
            public bool Delete(string p_sql, object param = null, IDbTransaction transaction = null)
            {
                int result = Connection.Execute(p_sql, param, transaction);
                return result > 0;
            }
            #endregion
    
            #region Excute / ExecuteScalar
            public int Excute(string p_sql, object param = null, IDbTransaction transaction = null)
            {
                return Connection.Execute(p_sql, param, transaction);
            }
    
            public object ExecuteScalar(string p_sql, object param = null, IDbTransaction transaction = null)
            {
                return Connection.ExecuteScalar(p_sql, param, transaction);
            }
    
            public U ExecuteScalar<U>(string p_sql, object param = null, IDbTransaction transaction = null)
            {
                return Connection.ExecuteScalar<U>(p_sql, param, transaction);
            }
            #endregion
    
            #region Get
            public T Get(string p_sql, object param = null, IDbTransaction transaction = null)
            {
                return Connection.QuerySingleOrDefault<T>(p_sql, param, transaction);
            }
    
            public U Get<U>(string p_sql, object param = null, IDbTransaction transaction = null)
            {
                return Connection.QuerySingleOrDefault<U>(p_sql, param, transaction);
            }
    
            public T GetBy(string where, object param = null, IDbTransaction transaction = null)
            {
                string p_sql = $"select * from {TableName} {where}";
                return Connection.QuerySingleOrDefault<T>(p_sql, param, transaction);
            }
    
            public T GetByKey(object key, IDbTransaction transaction = null)
            {
                string p_sql = $"select * from {TableName} where {PrimaryKeyName} = @key;";
                return Connection.QuerySingleOrDefault<T>(p_sql, new { key }, transaction);
            }
            #endregion
    
            #region Paging
            public PageDataView<U> GetPageList<U>(int pageIndex, int pageSize, IList<string> p_sqls, object param = null, IDbTransaction transaction = null)
            {
                int totalCount = Connection.ExecuteScalar<int>(p_sqls[0] + ";", param, transaction);
                IList<U> items = Connection.Query<U>(p_sqls[1] + $" limit {pageSize} offset {(pageIndex - 1) * pageSize};", param, transaction).ToList();
                PageDataView<U> result = new PageDataView<U>()
                {
                    PageIndex = pageIndex,
                    PageSize = pageSize,
                    TotalCount = totalCount,
                    Items = items
                };
                return result;
            }
    
            public PageDataView<U> GetPageListBy<U>(int pageIndex, int pageSize, string where, object param = null, IDbTransaction transaction = null)
            {
                string p_sql_count = $"select count(*) from {TableName} {where};";
                int totalCount = Connection.ExecuteScalar<int>(p_sql_count, param, transaction);
                string p_sql = $"select * from {TableName} {where} limit {pageSize} offset {(pageIndex - 1) * pageSize};";
                IList<U> items = Connection.Query<U>(p_sql, param, transaction).ToList();
                PageDataView<U> result = new PageDataView<U>() 
                { 
                    PageIndex = pageIndex,
                    PageSize = pageSize,
                    TotalCount = totalCount,
                    Items = items
                };
                return result;
            }
            #endregion
    
            #region IsExists
            public bool IsExists(string where, object param = null, IDbTransaction transaction = null)
            {
                string p_sql = $"select count(*) from {TableName} {where}";
                int result = Connection.ExecuteScalar<int>(p_sql, param, transaction);
                return result > 0;
            }
    
            public bool IsExists<U>(string where, object param = null, IDbTransaction transaction = null)
            {
                Type type = typeof(U);
                var tableName = type.Name;
                var at = type.GetCustomAttribute<TableAttribute>();
                if (at != null)
                {
                    tableName = at.Name;
                }
                string p_sql = $"select count(*) from {tableName} {where}";
                int result = Connection.ExecuteScalar<int>(p_sql, param, transaction);
                return result > 0;
            }
            #endregion
    
            #region List
            public IList<T> List(string p_sql, object param = null, IDbTransaction transaction = null)
            {
                return Connection.Query<T>(p_sql, transaction: transaction).ToList();
            }
    
            public IList<U> List<U>(string p_sql, object param = null, IDbTransaction transaction = null)
            {
                return Connection.Query<U>(p_sql, transaction: transaction).ToList();
            }
    
            public IList<T> ListAll(IDbTransaction transaction = null)
            {
                string p_sql = $"select * from {TableName};";
                return Connection.Query<T>(p_sql, transaction: transaction).ToList();
            }
    
            public IList<T> ListBy(string where, object param = null, IDbTransaction transaction = null)
            {
                string p_sql = $"select * from {TableName} {where};";
                return Connection.Query<T>(p_sql, transaction: transaction).ToList();
            }
            #endregion
    
            #region QueryMultiple
            public SqlMapper.GridReader QueryMultiple(string p_sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null)
            {
                return Connection.QueryMultiple(p_sql, transaction: transaction);
            }
            #endregion
        }
    }
    

      

     Dapper参数类型

     匿名参数类型:

    执行一次SQL命令:
    new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1"}
    执行多次SQL命令:
    new[]
    {
        new {Kind = InvoiceKind.WebInvoice, Code = "Many_Insert_1"},
        new {Kind = InvoiceKind.WebInvoice, Code = "Many_Insert_2"},
        new {Kind = InvoiceKind.StoreInvoice, Code = "Many_Insert_3"}
    }
    

     列表类型参数:

    Dapper允许您使用列表在IN子句中指定多个参数:
    new {Kind = new[] { InvoiceKind.StoreInvoice, InvoiceKind.WebInvoice }}
    

     类型参数:

    var affectedRows = connection.Execute(sql, employeeInfo);
    

      

     Dapper结果

    结果匿名:

    var invoices = connection.Query(sql).ToList();
    

     结果强类型:

    var invoices = connection.Query<Invoice>(sql).ToList();
    

     结果多映射(没有使用这种方式,多表我直接强类型或者分成多个方法):

    查询多映射(一对一):
        var invoices = connection.Query<Invoice, InvoiceDetail, Invoice>(
                sql,
                (invoice, invoiceDetail) =>
                {
                    invoice.InvoiceDetail = invoiceDetail;
                    return invoice;
                },
                splitOn: "InvoiceID")
            .Distinct()
            .ToList();
    查询多映射(一对多):
        var invoiceDictionary = new Dictionary<int, Invoice>();
    
        var invoices = connection.Query<Invoice, InvoiceItem, Invoice>(
                sql,
                (invoice, invoiceItem) =>
                {
                    Invoice invoiceEntry;
    
                    if (!invoiceDictionary.TryGetValue(invoice.InvoiceID, out invoiceEntry))
                    {
                        invoiceEntry = invoice;
                        invoiceEntry.Items = new List<InvoiceItem>();
                        invoiceDictionary.Add(invoiceEntry.InvoiceID, invoiceEntry);
                    }
    
                    invoiceEntry.Items.Add(invoiceItem);
                    return invoiceEntry;
                },
                splitOn: "InvoiceID")
            .Distinct()
            .ToList();
    

     结果多结果:

    using (var multi = connection.QueryMultiple(sql, new {InvoiceID = 1}))
    {
        var invoice = multi.Read<Invoice>().First();
        var invoiceItems = multi.Read<InvoiceItem>().ToList();
    }
    

     结果多类型(没有使用这种方式):

        var invoices = new List<Invoice>();
    
        using (var reader = connection.ExecuteReader(sql))
        {
            var storeInvoiceParser = reader.GetRowParser<StoreInvoice>();
            var webInvoiceParser = reader.GetRowParser<WebInvoice>();
    
            while (reader.Read())
            {
                Invoice invoice;
    
                switch ((InvoiceKind) reader.GetInt32(reader.GetOrdinal("Kind")))
                {
                    case InvoiceKind.StoreInvoice:
                        invoice = storeInvoiceParser(reader);
                        break;
                    case InvoiceKind.WebInvoice:
                        invoice = webInvoiceParser(reader);
                        break;
                    default:
                        throw new Exception(ExceptionMessage.GeneralException);
                }
    
                invoices.Add(invoice);
            }
        }
    
     Dapper扩展: 插入时返回自增长id
    var sql = @"INSERT INTO [MyTable] ([Stuff]) VALUES (@Stuff);";
    sql += "SELECT CAST(SCOPE_IDENTITY() as int)";
    var mytable = new MyTable();
    mytable.Stuff = "test";
    var id = connection.QueryFirstOfDefault<int>(sql, mytable);
    
     Dapper扩展: 工厂模式(仅供参考)

    利用工厂模式创建仓库:

    IFactoryRepository:

        /// <summary>
        /// 创建仓库接口
        /// </summary>
        public interface IFactoryRepository
        {
            /// <summary>
            /// 创建仓库
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="context"></param>
            /// <returns></returns>
            IRepository<T> CreateRepository<T>(IDapperContext context) where T : class;
        }
    

     FactoryRepository:

        /// <summary>
        /// 工厂
        /// </summary>
        public class FactoryRepository : IFactoryRepository
        {
            /// <summary>
            /// 创建Repository
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="context"></param>
            /// <returns></returns>
            public IRepository<T> CreateRepository<T>(IDapperContext context) where T : class
            {
                IRepository<T> repository = new Repository<T>(context);
                return repository;
            }
        }
    

      

     Dapper扩展: 读写分离(仅供参考)

     IDapperContext :

        /// <summary>
        /// Dapper上下文
        /// </summary>
        public interface IDapperContext : IDisposable
        {
            /// <summary>
            /// 数据库连接对象
            /// </summary>
            IDbConnection ReadConnection { get; }
     
            /// <summary>
            /// 数据库连接对象
            /// </summary>
            IDbConnection WriteConnection { get; }
        }

     DapperContext:

        public class DapperContext : IDapperContext
        {
            /// <summary>
            /// 读连接字符串
            /// </summary>
            private string _readConnectionString;
     
            /// <summary>
            /// 写连接字符串
            /// </summary>
            private string _writeConnectionString;
     
            private bool _useMiniProfiling;
     
            /// <summary>
            /// 读连接
            /// </summary>
            private IDbConnection _readConnection;
     
            /// <summary>
            /// 写连接
            /// </summary>
            private IDbConnection _wrteConnection;
     
            /// <summary>
            /// 配置
            /// </summary>
            private readonly AppSetting _appSetting;
     
            /// <summary>
            /// 构造函数注入IOptions
            /// </summary>
            /// <param name="appSetting"></param>
            public DapperContext(IOptions<AppSetting> appSetting)
            {
                _appSetting = appSetting.Value;
                _readConnectionString = _appSetting.ReadOnlyConnectionString;
                _writeConnectionString = _appSetting.SetConnectionString;
                _useMiniProfiling = _appSetting.UseMiniProfiling;
            }
     
            /// <summary>
            /// 连接字符串
            /// </summary>
            /// <param name="connectionString"></param>
            public DapperContext(string connectionString)
            {
                _readConnectionString = connectionString;
            }
     
            #region 读
     
            /// <summary>
            /// 获取连接
            /// </summary>
            public IDbConnection ReadConnection
            {
                get
                {
                    if (_readConnection == null || _readConnection.State == ConnectionState.Closed)
                    {
                        if (_useMiniProfiling)
                        {
                            _readConnection = new ProfiledDbConnection(new MySqlConnection(_readConnectionString), MiniProfiler.Current);
                        }
                        else
                        {
                            _readConnection = new MySqlConnection(_readConnectionString);
                        }
                    }
                    if (_readConnection.State != ConnectionState.Open)
                    {
                        _readConnection.Open();
                    }
                    return _readConnection;
                }
            }
     
            /// <summary>
            /// 释放连接
            /// </summary>
            public void Dispose()
            {
                if (_readConnection != null && _readConnection.State == ConnectionState.Open)
                    _readConnection.Close();
                if (_wrteConnection != null && _wrteConnection.State == ConnectionState.Open)
                    _wrteConnection.Close();
            }
     
            #endregion 读
     
            #region 写
     
            /// <summary>
            /// 获取连接
            /// </summary>
            public IDbConnection WriteConnection
            {
                get
                {
                    if (_wrteConnection == null || _wrteConnection.State == ConnectionState.Closed)
                    {
                        if (_useMiniProfiling)
                        {
                            _wrteConnection = new ProfiledDbConnection(new MySqlConnection(_writeConnectionString), MiniProfiler.Current);
                        }
                        else
                        {
                            _wrteConnection = new MySqlConnection(_writeConnectionString);
                        }
                    }
                    if (_wrteConnection.State != ConnectionState.Open)
                    {
                        _wrteConnection.Open();
                    }
                    return _wrteConnection;
                }
            }
     
            #endregion 写
        }
    

      

  • 相关阅读:
    [osg][原]自定义osgGA漫游器
    [osg]osg窗口显示和单屏幕显示
    sql中去除重复的数据 select distinct * from table
    Microsoft VBScript 运行时错误 错误 800a005e 无效使用 Null: Replace
    如何解决Access操作或事件已被禁用模式阻止
    sql 中 '' 与 null 的区别
    IsNull、rs、sum
    Access与SQL中的IsNull(),IS NULL的区别
    ASP将Table导出Excel
    ASP如何将table导出EXCEL表格
  • 原文地址:https://www.cnblogs.com/gygtech/p/14481680.html
Copyright © 2011-2022 走看看