Dapper同时操作任意多张表的实现
1:Dapper的查询帮助类,部分代码,其它新增更新删除可以自行扩展
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Text; namespace FEG.ESB.Data.EF
{
using Dapper;
using MySql.Data.MySqlClient;
using System.Threading.Tasks;
using static Dapper.SqlMapper; /// <summary>
///
/// </summary>
public class FEG_DapperHelper
{
private static string str = FEG_ConfigHelper.GetDbConnectionStr(); /// <summary>
/// 查询
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="parames"></param>
/// <returns></returns>
public static IEnumerable<T> Query<T>(string sql, object parames = null) where T : class, new()
{
try
{
using MySqlConnection conn = GetMySqlConnnetion();
return conn.Query<T>(sql, parames);
}
catch (Exception)
{
return null;
}
} /// <summary>
/// 查询 异步操作
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="parames"></param>
/// <returns></returns>
public static async Task<IEnumerable<T>> QueryAsync<T>(string sql, object parames = null) where T : class, new()
{
try
{
using MySqlConnection conn = GetMySqlConnnetion();
return await conn.QueryAsync<T>(sql, parames);
}
catch (Exception)
{
return null;
}
} #region old
///// <summary>
///// 查询两个实体的操作
///// </summary>
///// <param name="sql"></param>
///// <param name="parames"></param>
///// <returns></returns>
//public static Tuple<IEnumerable<T>, IEnumerable<M>> QueryTwoEntity<T, M>(string sql, object parames = null) where T : class where M : class, new()
//{
// try
// {
// using MySqlConnection conn = GetMySqlConnnetion();
// var readData = conn.QueryMultiple(sql, parames);
// var obj = readData.Read<T>() as IEnumerable<T>;
// var obj2 = readData.Read<M>() as IEnumerable<M>;
// return (obj, obj2).ToTuple();
// }
// catch (Exception)
// {
// return null;
// }
//}
#endregion /// <summary>
/// 同时查询多个实体的操作
/// </summary>
/// <param name="sql"></param>
/// <param name="funcObj"></param>
/// <param name="dicParams"></param>
/// <returns></returns>
public static void QueryMultipeEntity(string sql, Dictionary<string, object> dicParams, Action<GridReader> funcObj)
{
using MySqlConnection conn = GetMySqlConnnetion();
if (dicParams != null)
{
DynamicParameters ps = new DynamicParameters();
foreach (string item in dicParams.Keys)
{
ps.Add(item, dicParams[item]);
}
using (var readRsult = conn.QueryMultiple(sql, ps))
{
funcObj.Invoke(readRsult);
}
}
} /// <summary>
/// 获取 MySql连接
/// </summary>
/// <returns></returns>
private static MySqlConnection GetMySqlConnnetion()
{
return new MySqlConnection(str);
} /// <summary>
/// 获取Dapper参数化对象,这里直接New来处理,不到处引入命名空间
/// </summary>
/// <returns></returns>
public static DynamicParameters GetDynamicParameters()
{
return new DynamicParameters();
}
} /// <summary>
///
/// </summary>
public class FEG_ConfigHelper
{
public static IConfiguration _configuration { get; set; }
/// <summary>
/// 获取连接数据库的字符串
/// </summary>
/// <returns></returns>
public static string GetDbConnectionStr()
{
return _configuration.GetSection("ConnectionStrings:ReadonlyConnection").Value;
} /// <summary>
///
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static string GetAppSettingValueByKey(string key)
{
return _configuration.GetSection(key).Value;
} /// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public static T GetAppSettingEntity<T>(string key) where T : class, new()
{
return _configuration.GetSection(key).Value as T;
}
}
}
2:调用的代码:
/// <summary>
/// Test dapper,同时查询多个表的操作
/// </summary>
/// <returns></returns>
[HttpPost,Route("TestGridReader")]
public BasisApiResult TestGridReader()
{
BasisApiResult result = new BasisApiResult();
result.data = _personnelService.TestGridReader<FEG.ESB.Data.Model.personnel, FEG.ESB.Data.Model.course>();
return result;
}
public Tuple<IEnumerable<T>, IEnumerable<M>> TestGridReader<T, M>()
{
IEnumerable<T> plist = null;
IEnumerable<M> clist = null;
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("isdel", "0");
FEG_DapperHelper.QueryMultipeEntity("select * from personnel where isdel=@isdel limit 0,1;select * from course where isdel=@isdel limit 0,1;", dic, x =>
{
plist = x.Read<T>().ToList();
clist = x.Read<M>().ToList();
});
return Tuple.Create(plist, clist);
}
3:测试OK截图:

Dapper同时操作任意多张表的实现的更多相关文章
- 多对多第三张表的创建方式 和 forms组件的使用
目录 一.多对多第三张表的创建 1. 全自动方式 (1)实现代码 (2)优点和不足 2. 纯手撸方式(了解) (1)实现代码 (2)优点和不足 3. 半自动方式(推荐使用) (1)实现代码 (2)优点 ...
- ORM多表操作之创建关联表及添加表记录
创建关联表 关于表关系的几个结论 (1)一旦确立表关系是一对多:建立一对多关系----在多对应的表中创建关联字段. (2)一旦确立表关系是多对多:建立多对多关系----创建第三张关系表----id和两 ...
- 实现多个ContentProvider对多张表进行操作
http://blog.csdn.net/maylian7700/article/details/7365373 SQLite数据库直接操作类: DatabaseHelper.java package ...
- 一起学Hadoop——实现两张表之间的连接操作
---恢复内容开始--- 之前我们都是学习使用MapReduce处理一张表的数据(一个文件可视为一张表,hive和关系型数据库Mysql.Oracle等都是将数据存储在文件中).但是我们经常会遇到处理 ...
- (10)MySQL触发器(同时操作两张表)
什么是触发器 触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合.触发器的这种特性可以协助应用在数据库端确保数据的完整性. 举个例子,比如你现在有两个表[用户表]和[日志 ...
- android 玩转ContentProvider之二--实现多个ContentProvider对多张表进行操作
SQLite数据库直接操作类: DatabaseHelper.java package com.jacp.database; import android.content.Context; impor ...
- 第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表、课程评论表、用户收藏表、用户消息表、用户学习表
第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表.课程评论表.用户收藏表.用户消息表.用户学习表 创建名称为ap ...
- update操作多张表
sql 语句多张表UPDATE用法一.当用一个表中的数据来更新另一个表中的数据,T-SQL提供多种写法(下面列出了二种),但建议用第一种写法,虽然传统,但结构清晰.飞.飞Asp技术乐园并且要注意,当用 ...
- oracle高级查询(实例基于scott用户四张表)
oracle高级查询(实例基于scott用户四张表) 分组查询 多表查询 子查询 综合实例 ====================================================== ...
随机推荐
- 【并查集模板】并查集模板 luogu-3367
题目描述 简单的并查集模板 输入描述 第一行包含两个整数N.M,表示共有N个元素和M个操作. 接下来M行,每行包含三个整数Zi.Xi.Yi 当Zi=1时,将Xi与Yi所在的集合合并 当Zi=2时,输出 ...
- Ory Kratos 用户认证
Ory Kratos 为用户认证与管理系统.本文将动手实现浏览器(React+AntD)的完整流程,实际了解下它的 API . 代码: https://github.com/ikuokuo/start ...
- odoo里API解读
Odoo自带的api装饰器主要有:model,multi,one,constrains,depends,onchange,returns 七个装饰器. multimulti则指self是多个记录的合集 ...
- 开源低代码平台开发实践二:从 0 构建一个基于 ER 图的低代码后端
前后端分离了! 第一次知道这个事情的时候,内心是困惑的. 前端都出去搞 SPA,SEO 们同意吗? 后来,SSR 来了. 他说:"SEO 们同意了!" 任何人的反对,都没用了,时代 ...
- 8.3考试总结(NOIP模拟19)[最长不下降子序列·完全背包问题·最近公共祖先]
一定要保护自己的梦想,即使牺牲一切. 前言 把人给考没了... 看出来 T1 是一个周期性的东西了,先是打了一个暴力,想着打完 T2 T3 暴力就回来打.. 然后,就看着 T2 上头了,后来发现是看错 ...
- 群晖NAS网络存储服务器防盗防小偷
群晖NAS网络存储服务器防盗防小偷 根据群晖NAS的实际测量外形尺寸到淘宝网邮购金属 配电箱(弱电箱). 把配电箱(弱电箱)用粗螺丝固定到机柜或墙壁上. 把群晖NAS用密码纯铜挂锁锁在配电箱(弱电箱 ...
- Java 浮点数精确性探讨(IEEE754 / double / float)与 BigDecimal 解决方案
一.抛砖引玉 一个简单的示例: double a = 0.0; IntStream.range(0,3).foreach(i->a+=0.1); System.out.println(a); / ...
- Android面试6家一线大厂,这个问题是必问!
年后面了六家大厂,每家都会问的一个问题就是Android的消息机制!可见Android的消息机制是多么重要! 消息机制之所以这么重要是因为Android应用程序是通过消息来驱动的,Android某种意 ...
- 数据结构与算法-排序(六)堆排序(Heap Sort)
摘要 堆排序需要用到一种数据结构,大顶堆.大顶堆是一种二叉树结构,本质是父节点的数大于它的左右子节点的数,左右子节点的大小顺序不限制,也就是根节点是最大的值. 这里就是不断的将大顶堆的根节点的元素和尾 ...
- SpringMVC学习09(文件的上传和下载)
文件上传和下载 准备工作 文件上传是项目开发中最常见的功能之一 ,springMVC 可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况 ...