首页 > 数据库 >Dapper升级SqlSugar问题汇总

Dapper升级SqlSugar问题汇总

时间:2024-05-22 16:19:43浏览次数:23  
标签:string 汇总 id new Dapper null public 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; }
}

效果图

image.png

 

  

 

标签:string,汇总,id,new,Dapper,null,public,SqlSugar
From: https://www.cnblogs.com/sunkaixuan/p/18206516

相关文章

  • SonarQube扫描bugs&漏洞处理汇总
    SonarQube扫描bugs&漏洞处理汇总工作中遇到和参考其他资料汇总--仅供自我学习目录BugsUsean"instanceof"comparisoninstead.Castoneoftheoperandsofthisintegerdivisiontoa"double"Removethisthrowstatementfromthisfinallyblock.Removethisreturnstate......
  • 面试题汇总——面试题汇总截图——根据此次面试复习整理
    正常显示可能不清晰,可以放大看      ......
  • SqlSugar SqlFunc常用方法
    开始做项目管理了(本人3年java,来到这边之后真没想到...),天天开会沟通整理需求,他们讲话的时候忙里偷闲整理一下常用的方法,其实语言还是有共通性的,基本上看到方法名就大概能猜出来用法。出去打水的时候看到外面太阳好好,真想在外面坐着晒太阳,回来的时候好兄弟三年前送给我的键盘D键不灵......
  • rthread学习记录汇总-不断更新
    1、rthread同Linux类似,包含了所有主流的芯片、cpu架构,可从官方获取最新的rt-thread源码后进行裁剪 2、可从rthread官网下载env工具,env工具可用来对rtthread源码生成mdk/iar工程命令式scons--target=mdk5  scons--targe=iarscons自带的编译固件功能,命令为scnons,默认用......
  • 物联网-信息安全技术要求标准汇总
    安全技术要求的背景随着物联网(IoT)技术的迅猛发展,越来越多的设备通过互联网连接起来,实现了智能家居、智慧城市、智能医疗等众多应用场景。根据Gartner的预测,到2025年,全球将有超过750亿台设备接入物联网。这一趋势不仅提升了生活和生产的便利性,也带来了前所未有的安全挑战。物联网......
  • 腾讯、阿里、B站最新面经汇总,有的妥妥的凉经
    除了BAT(没错我说的B是B站的B),还有网易、希音科技、美柚等中小厂的最新面经。这次投稿的同学行文幽默风趣,处处透漏着不成功便搞笑的骚气。祝他早日上岸,也欢迎大家在评论区讨论这些面试题,有哪些面试题不知道怎么回答好,可以在评论区讨论留言,我会及时回复的。b站外包/go开发/一面......
  • Vue学习知识汇总
    官网:https://cn.vuejs.org/前置知识:完整的学习vue:html+css、JavaScript、css3、HTML5、第三方库、网络通信、ES6+、webpack、模块化、包管理器、css预编译器体验vue功能:html+css、JavaScriptVue拥有以下特点:渐进式组件化响应式Vue的应用场景:前台的部分页面......
  • 【java】问题排查-内存溢出(OOM)-汇总指南
    1、java.lang.OutOfMemoryError:Javaheapspace原因分析示例解决方案2、java.lang.OutOfMemoryError:GCoverheadlimitexceeded原因分析示例解决方案3、java.lang.OutOfMemoryError:Permgenspace原因分析示例解决方案4、java.lang.OutOfMemoryErr......
  • Mysql 中的日期时间函数汇总
    日期和时间函数MySQL中内置了大量的日期和时间函数,能够灵活、方便地处理日期和时间数据,本节就简单介绍一下MySQL中内置的日期和时间函数。1CURDATE()函数CURDATE()函数用于返回当前日期,只包含年、月、日部分,格式为YYYY-MM-DD。使用示例如下:mysql>SELECTCURDATE();+------......
  • golang 压缩包解压问题汇总
    解压代码packagemainimport( "archive/zip" "bytes" "fmt" "golang.org/x/text/encoding/simplifiedchinese" "golang.org/x/text/transform" "io" "io/ioutil" "os" "path/......