Dapper升级SqlSugar问题汇总
最近群里有个小伙伴把Dapper迁移SqlSugar几个不能解决的问题进行一个汇总,我正好写一篇文章来讲解一下
一、sql where in传参问题:
SELECT * FROM users where id IN @ids
答: SqlSugar中应该是
// SELECT * FROM users where id IN (@ids)
var listdb.Ado.SqlQuery<Users>(sql,new {id=new int[]{1,2,3}})
二、Dapper查询出来的Dynamic动态类型,支持获取不存在的属性
例如:SELECT UserName FROM users
可以通过 result.UserCode,不会报错
答:dynamic expandobject 属性不存在肯定是会报错的 , list[0].id如果不存肯定报错
这个需求还是头一次,因为不报错可能不严谨SQLSugar暂时没有这个方法可以通扩展一个方法实现
using System.Collections.Generic;
using System.Dynamic; public class ForgivingDynamicObject : DynamicObject
{
private readonly Dictionary<string, object> _members = new Dictionary<string, object>(); public override bool TryGetMember(GetMemberBinder binder, out object result)
{
// 尝试从字典中获取成员,如果不存在则返回null
return _members.TryGetValue(binder.Name, out result) || (result = null) != null;
} public override bool TrySetMember(SetMemberBinder binder, object value)
{
// 将成员设置到字典中
_members[binder.Name] = value;
return true;
}
}
public static class DynamicExtensions
{
public static ForgivingDynamicObject ToForgivingDynamicObject(this dynamic dynamicObject)
{
var forgivingObject = new ForgivingDynamicObject();
if (dynamicObject is IDictionary<string, object> dictionary)
{
foreach (var kvp in dictionary)
{
forgivingObject.TrySetMember(new SetMemberBinder(kvp.Key, false), kvp.Value);
}
}
return forgivingObject;
}
} dynamic expando = new ExpandoObject();
expando.ExistingProperty = "Hello"; // 转换为 ForgivingDynamicObject
ForgivingDynamicObject forgivingObj = expando.ToForgivingDynamicObject(); // 访问存在的属性
string value = forgivingObj.ExistingProperty; // "Hello" // 访问不存在的属性,将返回null而不是抛出异常
string nonExistingValue = forgivingObj.NonExistingProperty; // null
三、表值参数必须传typeName
Dapper是可以不用传的
Sqlsugar在5.4.1.152+ 下面value可以传null了
//SqlSugar中用法
var s = new SugarParameter("@p", value);
s.TypeName = "dtTableName";
四类型转换:在Dapper中很多类型做了兼容处理。
比如:数据库中是string,但值是int SELECT CAST( id as nvarchar) id FROM users
Dapper中Query实体时,id允许定义为string,
答:Sqlsugar中类型只支持int转string,不支持string转int
默认不支持反向转换考虑到数据严谨性,防止线上数据因错误数据导致系统出错
解决方案:加上特性让他支持转换
[SugarColumn(SqlParameterDbType=typeof(CommonPropertyConvert))]//ORM自带的也支持重写这个转换类
public DateTime DcValue { get; set; }
五、Dapper 联表VO转换
l 不支持IEnumerable<TReturn> Query<TFirst, TSecond, TReturn>(string sql, Func<TFirst, TSecond, TReturn> map, object? param = null, IDbTransaction? transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null) =>
MultiMap<TFirst, TSecond, DontMap, DontMap, DontMap, DontMap, DontMap, TReturn>(cnn, sql, map, param, transaction, buffered, splitOn, commandTimeout, commandType)
主要用于结果集返回之后,包装成一个有层次的对象。
Dapper执行ExecuteReader方法之后,还能通过Get<T>(“params”)获取到。SqlSugar是直接无法获取的,需要包装一次,从DataReaderParameters中获取。
答:
SqlSugar同样可以支持一维对象变成2维对象
var list=db.SqlQueryable<SQLVO>("select 1 as id,'jack' as name ").ToList();
public class SQLVO
{
[SugarColumn(IsOwnsOne =true)]
public ITEM1 ITEM1 { get; set; }//item1和item2不能有重复字段
[SugarColumn(IsOwnsOne = true)]
public ITEM2 ITEM2 { get; set; }//item1和item2不能有重复字段
}
public class ITEM1
{
public int ID { get; set; }
}
public class ITEM2
{
public string Name { get; set; }
}
效果图

Dapper升级SqlSugar问题汇总的更多相关文章
- c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比
c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比对比 在6.22 号发布了 c# sqlsugar,his ...
- Discuz 升级X3问题汇总整理
最近一段时间公司的社区垃圾帖数量陡然上涨,以至于社区首页的推荐版块满满都是垃圾帖的身影,为了进一步解决垃圾帖问题我们整整花了1天时间删垃圾贴,清除不良用户,删的手都酸了,可见垃圾帖的数量之多!可耻的刷 ...
- ORACLE 10g 升级 11g问题汇总(转载文)
按照计划开始了生产库的升级,环境基于linux 64位. uname: Linux 2.6.18-308.el5 #1 SMP Fri Jan 27 17:17:51 EST 2012 x86_64 ...
- .netFramework 升级NetCore 问题汇总及解决方案
升级版本: NetCore sdk 2.2.108 .AspNetCore 2.2.0.EFCore 2.2.6 所有程序引用均从NuGet上下载,并支持NetCore 问题: 问题1:No coer ...
- AA.Dapper升级了
AA.Dapper基于dapper进一步封装而成的orm框架,提供增删改查.分页.事务.原生sql的功能,以满足日常的业务开发. 1.Repository层: DapperRepository类包含大 ...
- Dapper ORM VS SqlSugar ORM的 8场对决
CUP和.NET SQL版本不同也会存在少许差距,但不会有质变,下面的测试结果仅供参考 比赛规则 1.统一使用Realse版本的最新 DLL,Realse模式启用程序 2.为了平衡CPU和数据库空闲情 ...
- ORM框架——Dapper
1.什么是ORM ORM(Object Relational Mapping)对象关系映射,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术,用于实现面向对象编程语言里不同类型系统的数据之 ...
- ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借
ASP.NET MVC深入浅出系列(持续更新) 一. ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态模 ...
- 第一章 搭建一个通用的.net core项目框架
项目目标部署环境:CentOS 7+ 项目技术点:.netcore2.0 + Autofac +webAPI + NHibernate5.1 + mysql5.6 + nginx 开源地址:https ...
- ORM系列之Entity FrameWork详解
一. 谈情怀 从第一次接触开发到现在(2018年),大约有六年时间了,最初阶段连接数据库,使用的是[SQL语句+ADO.NET],那时候,什么存储过程.什么事务 统统不理解,生硬的将SQL语句传入SQ ...
随机推荐
- Java 数据类型详解与类型转换技巧
Java 数据类型 Java 中的变量必须是指定的数据类型: int myNum = 5; // 整数 float myFloatNum = 5.99f; // 浮点数 char myLetter = ...
- Grafana 系列-统一展示-4-AWS Cloudwatch 数据源
系列文章 Grafana 系列文章 AWS Cloudwatch 数据源 对于 AWS Cloudwatch, 主要在于 3 种不同的认证方式: AWS SDK Default IAM Role AK ...
- web 报表工具如何自适应
现在的报表用户已经不再将报表作为一个单纯的报表工具看待了,有时候也会当作页面工具来使用,这时为了页面显示工整美观,就需要报表能够自适应宽度.下面我们就基于润乾报表来讲一下是如何做到自适应展现报表. 产 ...
- linux 性能自我学习 ———— 不可中断进程和僵尸进程 [四]
前言 简单介绍一下不可中断进程和僵尸进程. 正文 先来看下进程的状态: 那么这一列的状态是什么呢? R 是Running 或 Runnable 的缩写, 表示进程在cpu 的就绪队列中,正在运行或者正 ...
- 剑指offer04(Java)二维数组中的查找(中等)
题目: 在一个 n * m 的二维数组中,每一行都按照从左到右 非递减 的顺序排序,每一列都按照从上到下 非递减 的顺序排序.请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有 ...
- 力扣412(java)-Fizz Buzz(简单)
题目: 给你一个整数 n ,找出从 1 到 n 各个整数的 Fizz Buzz 表示,并用字符串数组 answer(下标从 1 开始)返回结果,其中: answer[i] == "FizzB ...
- PolarDB-X 高可用存储服务: 基于 X-Paxos 一致性协议
简介: 摘自刘永平(慕少)阿里云 PolarDB-X 技术专家在PolarDB-X | 新品发布会中的讲解内容. 了解更多PolarDB-X 内容:https://developer.aliyun.c ...
- OpenYurt 深度解读:如何构建 Kubernetes 原生云边高效协同网络?
作者 | 郑超 导读:OpenYurt 是阿里巴巴开源的云边协同一体化架构,与同类开源方案相比,OpenYurt 拥有可实现边缘计算全场景覆盖的能力.在之前的一篇文章中,我们介绍了 OpenYurt ...
- 冷热分离之OTS表格存储实战
简介: 为什么要冷热分离由于2020疫情的原因,在线教育行业提前被大家所重视,钉钉教育已经服务超过21万所学校.700万教师和1.4亿学生用户,每天大量的教育数据产生.整体数据量:随着时间的积累,数据 ...
- 庖丁解牛|图解 MySQL 8.0 优化器查询转换篇
简介: 本篇介绍子查询.分析表和JOIN的复杂转换过程 一 背景和架构 在<庖丁解牛-图解MySQL 8.0优化器查询解析篇>一文中我们重点介绍了MySQL最新版本8.0.25关于SQ ...