经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » SQL语言 » 查看文章
Dapper迁移SqlSugar问题汇总
来源:cnblogs  作者:阿妮亚  时间:2024/5/24 10:27:13  对本文有异议

最近群里有个小伙伴把Dapper迁移SqlSugar几个不能解决的问题进行一个汇总,我正好写一篇文章来讲解一下

 

一、sql where in传参问题:

  1. SELECT * FROM users where id IN @ids 

答: SqlSugar中应该是

  1. var sql="SELECT * FROM users where id IN (@ids)";//要有()和dapper有差异
  2. var list=db.Ado.SqlQuery<Users>(sql,new {ids=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. public class ForgivingDynamicObject : DynamicObject
  4. {
  5. private readonly Dictionary<string, object> _members = new Dictionary<string, object>();
  6. public override bool TryGetMember(GetMemberBinder binder, out object result)
  7. {
  8. // 尝试从字典中获取成员,如果不存在则返回null
  9. return _members.TryGetValue(binder.Name, out result) || (result = null) != null;
  10. }
  11. public override bool TrySetMember(SetMemberBinder binder, object value)
  12. {
  13. // 将成员设置到字典中
  14. _members[binder.Name] = value;
  15. return true;
  16. }
  17. }
  18. public static class DynamicExtensions
  19. {
  20. public static ForgivingDynamicObject ToForgivingDynamicObject(this dynamic dynamicObject)
  21. {
  22. var forgivingObject = new ForgivingDynamicObject();
  23. if (dynamicObject is IDictionary<string, object> dictionary)
  24. {
  25. foreach (var kvp in dictionary)
  26. {
  27. forgivingObject.TrySetMember(new SetMemberBinder(kvp.Key, false), kvp.Value);
  28. }
  29. }
  30. return forgivingObject;
  31. }
  32. }
  33.  
  34. dynamic expando = new ExpandoObject();
  35. expando.ExistingProperty = "Hello";
  36.  
  37. // 转换为 ForgivingDynamicObject
  38. ForgivingDynamicObject forgivingObj = expando.ToForgivingDynamicObject();
  39.  
  40. // 访问存在的属性
  41. string value = forgivingObj.ExistingProperty; // "Hello"
  42.  
  43. // 访问不存在的属性,将返回null而不是抛出异常
  44. 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<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)

主要用于结果集返回之后,包装成一个有层次的对象。

答:

SqlSugar同样可以支持一维对象变成2维对象

  1. var list=db.SqlQueryable<SQLVO>("select 1 as id,'jack' as name ").ToList();
  2. public class SQLVO
  3. {
  4. [SugarColumn(IsOwnsOne =true)]
  5. public ITEM1 ITEM1 { get; set; }//item1和item2不能有重复字段
  6. [SugarColumn(IsOwnsOne = true)]
  7. public ITEM2 ITEM2 { get; set; }//item1和item2不能有重复字段
  8. }
  9. public class ITEM1
  10. {
  11. public int ID { get; set; }
  12. }
  13. public class ITEM2
  14. {
  15. public string Name { get; set; }
  16. }

效果图

image.png

 

 六、 获取Output

Dapper执行ExecuteReader方法之后,还能通过Get<T>(“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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号