最近群里有个小伙伴把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问题汇总的更多相关文章

  1. c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比

    c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比对比 在6.22 号发布了 c# sqlsugar,his ...

  2. Discuz 升级X3问题汇总整理

    最近一段时间公司的社区垃圾帖数量陡然上涨,以至于社区首页的推荐版块满满都是垃圾帖的身影,为了进一步解决垃圾帖问题我们整整花了1天时间删垃圾贴,清除不良用户,删的手都酸了,可见垃圾帖的数量之多!可耻的刷 ...

  3. ORACLE 10g 升级 11g问题汇总(转载文)

    按照计划开始了生产库的升级,环境基于linux 64位. uname: Linux 2.6.18-308.el5 #1 SMP Fri Jan 27 17:17:51 EST 2012 x86_64 ...

  4. .netFramework 升级NetCore 问题汇总及解决方案

    升级版本: NetCore sdk 2.2.108 .AspNetCore 2.2.0.EFCore 2.2.6 所有程序引用均从NuGet上下载,并支持NetCore 问题: 问题1:No coer ...

  5. AA.Dapper升级了

    AA.Dapper基于dapper进一步封装而成的orm框架,提供增删改查.分页.事务.原生sql的功能,以满足日常的业务开发. 1.Repository层: DapperRepository类包含大 ...

  6. Dapper ORM VS SqlSugar ORM的 8场对决

    CUP和.NET SQL版本不同也会存在少许差距,但不会有质变,下面的测试结果仅供参考 比赛规则 1.统一使用Realse版本的最新 DLL,Realse模式启用程序 2.为了平衡CPU和数据库空闲情 ...

  7. ORM框架——Dapper

    1.什么是ORM ORM(Object Relational Mapping)对象关系映射,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术,用于实现面向对象编程语言里不同类型系统的数据之 ...

  8. 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的无状态模 ...

  9. 第一章 搭建一个通用的.net core项目框架

    项目目标部署环境:CentOS 7+ 项目技术点:.netcore2.0 + Autofac +webAPI + NHibernate5.1 + mysql5.6 + nginx 开源地址:https ...

  10. ORM系列之Entity FrameWork详解

    一. 谈情怀 从第一次接触开发到现在(2018年),大约有六年时间了,最初阶段连接数据库,使用的是[SQL语句+ADO.NET],那时候,什么存储过程.什么事务 统统不理解,生硬的将SQL语句传入SQ ...

随机推荐

  1. Python 集合(Sets)2

    访问项 您无法通过引用索引或键来访问集合中的项.但是,您可以使用for循环遍历集合项,或者使用in关键字检查集合中是否存在指定的值. 示例,遍历集合并打印值: thisset = {"app ...

  2. 快速加入Health Kit,一文了解审核流程

    HUAWEI Health Kit是为华为生态应用打造的基于华为帐号和用户授权的运动健康数据开放平台. 在获取用户授权后,开发者可以使用Health Kit提供的开放能力获取运动健康数据,基于多种类型 ...

  3. Qt数据结构-QString一:常用方法

    一.拼接字符串 拼接字符串有两种方法: +=  .  append QString s; s = "hello"; s = s + " "; s += &quo ...

  4. 面试官:实战中用过CountDownLatch吗?详细说一说,我:啊这

    写在开头 在很多的面经中都看到过提问 CountDownLatch 的问题,正好我们最近也在梳理学习AQS(抽象队列同步器),而CountDownLatch又是其中典型的代表,我们今天就继续来学一下这 ...

  5. ip 记录路由选项

    前言 准备整理网络这块,先把概念整理. ip记录路由选项,这个是做什么的呢? 比如说我们发的一条信息,从一端到另外一端经过了那些路由呢?这是一个问题啊. 这个ip记录路由选项就是来看这个问题的,当然这 ...

  6. ping 介绍

    前言 因为要整理网络这一块,所以打算先把概念写下.这节介绍ping的实现原理. 正文 先看一下图: 又没有发现和我们的icmp很像?对头.在icmp中,我写道:icmp有两种报文,一种是差错报文,一种 ...

  7. 密码学中的RSA算法与椭圆曲线算法

    PrimiHub一款由密码学专家团队打造的开源隐私计算平台,专注于分享数据安全.密码学.联邦学习.同态加密等隐私计算领域的技术和内容. 在数字安全领域,加密算法扮演着至关重要的角色.它们确保了信息的机 ...

  8. Unity性能优化——托管堆/GC

    了解托管堆 许多 Unity 开发者面临的另一个常见问题是托管堆的意外扩展.在 Unity 中,托管堆的扩展比收缩容易得多.此外,Unity 的垃圾收集策略往往会使内存碎片化,因此可能阻止大型堆的收缩 ...

  9. 使用纯c#在本地部署多模态模型,让本地模型也可以理解图像

    之前曾经分享过纯c#运行开源本地大模型Mixtral-8x7B 当时使用的是llamasharp这个库和Mixtral的模型在本地部署和推理,前段时间我看到llamasharp更新到了0.11.1版本 ...

  10. CF1535F String Distance

    \(CF1535F\ \ String\ Distance\) 题意 给 \(n\) 个长度均为 \(len\) 的字符串 \(T_1,T_2,\dots T_n\),定义 \(f(a,b)\) 为将 ...