翼度科技»论坛 编程开发 .net 查看内容

Dapper升级SqlSugar问题汇总

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
最近群里有个小伙伴把Dapper迁移SqlSugar几个不能解决的问题进行一个汇总,我正好写一篇文章来讲解一下
 
一、sql where in传参问题:
  1.   SELECT * FROM users where id IN @ids 
复制代码
答: SqlSugar中应该是
  1. // SELECT * FROM users where id IN (@ids)
  2. 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暂时没有这个方法可以通扩展一个方法实现
  1. using System.Collections.Generic;  
  2. using System.Dynamic;  
  3.   
  4. public class ForgivingDynamicObject : DynamicObject  
  5. {  
  6.     private readonly Dictionary<string, object> _members = new Dictionary<string, object>();  
  7.   
  8.     public override bool TryGetMember(GetMemberBinder binder, out object result)  
  9.     {  
  10.         // 尝试从字典中获取成员,如果不存在则返回null  
  11.         return _members.TryGetValue(binder.Name, out result) || (result = null) != null;  
  12.     }  
  13.   
  14.     public override bool TrySetMember(SetMemberBinder binder, object value)  
  15.     {  
  16.         // 将成员设置到字典中  
  17.         _members[binder.Name] = value;  
  18.         return true;  
  19.     }  
  20. }
  21. public static class DynamicExtensions
  22. {
  23. public static ForgivingDynamicObject ToForgivingDynamicObject(this dynamic dynamicObject)
  24. {
  25. var forgivingObject = new ForgivingDynamicObject();
  26. if (dynamicObject is IDictionary<string, object> dictionary)
  27. {
  28. foreach (var kvp in dictionary)
  29. {
  30. forgivingObject.TrySetMember(new SetMemberBinder(kvp.Key, false), kvp.Value);
  31. }
  32. }
  33. return forgivingObject;
  34. }
  35. }
  36. dynamic expando = new ExpandoObject();
  37. expando.ExistingProperty = "Hello";
  38. // 转换为 ForgivingDynamicObject
  39. ForgivingDynamicObject forgivingObj = expando.ToForgivingDynamicObject();
  40. // 访问存在的属性
  41. string value = forgivingObj.ExistingProperty; // "Hello"
  42. // 访问不存在的属性,将返回null而不是抛出异常
  43. string nonExistingValue = forgivingObj.NonExistingProperty; // null
复制代码
  
三、表值参数必须传typeName
       Dapper是可以不用传的
       Sqlsugar在5.4.1.152+  下面value可以传null了
  1. //SqlSugar中用法
  2. var s = new SugarParameter("@p", value);
  3. s.TypeName = "dtTableName";     
复制代码
 
四、类型转换:在Dapper中很多类型做了兼容处理。
比如:数据库中是string,但值是int  SELECT CAST( id as nvarchar) id  FROM users
Dapper中Query实体时,id允许定义为string,
答:Sqlsugar中类型只支持int转string,不支持string转int
默认不支持反向转换考虑到数据严谨性,防止线上数据因错误数据导致系统出错
解决方案:加上特性让他支持转换
  1. [SugarColumn(SqlParameterDbType=typeof(CommonPropertyConvert))]//ORM自带的也支持重写这个转换类
  2. public DateTime DcValue { get; set; }
复制代码
  
五、Dapper 联表VO转换   
l  不支持IEnumerable Query(string sql, Func map, object? param = null, IDbTransaction? transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null) =>

            MultiMap(cnn, sql, map, param, transaction, buffered, splitOn, commandTimeout, commandType)
主要用于结果集返回之后,包装成一个有层次的对象。
答:
SqlSugar同样可以支持一维对象变成2维对象
  1. var list=db.SqlQueryable<SQLVO>("select 1 as id,'jack' as name ").ToList();
  2.      
  3.          
  4. public class SQLVO
  5. {
  6.      [SugarColumn(IsOwnsOne =true)]
  7.      public ITEM1 ITEM1 { get; set; }//item1和item2不能有重复字段
  8.             
  9.      [SugarColumn(IsOwnsOne = true)]
  10.      public ITEM2 ITEM2 { get; set; }//item1和item2不能有重复字段
  11. }
  12. public class ITEM1
  13. {
  14.      public int ID { get; set; }
  15. }
  16. public class ITEM2
  17. {
  18.     public string Name { get; set; }
  19. }
复制代码
效果图

 
 六、 获取Output
Dapper执行ExecuteReader方法之后,还能通过Get(“params”)获取到。SqlSugar是直接无法获取的,需要包装一次,从DataReaderParameters中获取。 
 答: 暂时没有get方法可以通索引拿出来
  1. //我们还可以用 GetParameters 来简化参数操作
  2. SugarParameter [] pars =db.Ado.GetParameters(new{p=1,p2=p});
  3. pars[1].Direction=ParameterDirection.Output;
  4. db.Ado.ExecuteCommand(sql,pars);
  5. var outValue=pars[1].Value;
复制代码
 

来源:https://www.cnblogs.com/sunkaixuan/p/18206516
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
来自手机

举报 回复 使用道具