Dapper升级SqlSugar问题汇总

dapper,sqlsugar · 浏览次数 : 0

小编点评

**Dapper 中的 SQL WHERE 语句问题** **1. 在 @ids 中传递多值时,`SqlSugar` 中如何处理?** 在 `SqlSugar` 中,当 `@ids` 中传递多值时,会将参数值转换为 `SqlDbType.Int64` 类型。如果 `@ids` 中的元素是字符串,则会转换为 `SqlDbType.String` 类型。 **2. 如何获取 Dynamic 属性的值?** `DynamicObject` 类中的 `TryGetMember` 方法可以用于获取动态属性的值。如果属性不存在,则返回 `null`。`DynamicExtensions` 类中的 `ToForgivingDynamicObject` 方法可以将 `IDictionary` 类型转换为 `ForgivingDynamicObject` 类。 **3. 如何在 SQL 中处理表值参数?** 在 `SqlSugar` 中,可以使用 `SugarColumn` 属性来设置表值参数的类型。例如,`id` 列的类型设置为 `CommonPropertyConvert`。 **4. 如何进行类型转换?** `Dapper` 支持多种类型的转换,包括 `CommonPropertyConvert`、`SqlDateTime`、`SqlInt` 和 `SqlString`。在使用 `ToForgivingDynamicObject` 方法之前,请确保所有参数的类型一致。 **5. 如何使用多维对象进行查询?** `MultiMap` 方法可以用于将多个实体映射到一个二维对象中。例如,以下代码将查询所有 `SQLVO` 对象: ```csharp var list = db.SqlQueryable .Select(x => new SQLVO { ITEM1 = x.ITEM1, ITEM2 = x.ITEM2 }) .ToList(); ``` **总结:** * `SqlSugar` 中的 WHERE 语句使用 `SqlDbType.Int64` 或 `SqlDbType.String` 来处理多值参数。 * `DynamicObject` 类提供了 `TryGetMember` 方法来获取动态属性的值。 * `SqlSugar` 支持多种类型的转换,包括 `CommonPropertyConvert`、`SqlDateTime`、`SqlInt` 和 `SqlString`。 * `MultiMap` 方法可以用于将多个实体映射到一个二维对象中。

正文

最近群里有个小伙伴把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

 

  

 

与Dapper升级SqlSugar问题汇总相似的内容:

Dapper升级SqlSugar问题汇总

最近群里有个小伙伴把Dapper迁移SqlSugar几个不能解决的问题进行一个汇总,我正好写一篇文章来讲解一下 一、sql where in传参问题: SELECT * FROM users where id IN @ids 答: SqlSugar中应该是 SELECT * FROM users w

执行SQL语句&存储过程的真正【神器】,不用ORM的全选它,比dapper好

支持.Net Core(2.0及以上)与.Net Framework(4.0及以上)(注意:升级了,可以覆盖到早期的.Net Framework4.0了,而且修复了数据库字段为Null时报错的问题,无敌了!!) 此工具在IDataAccess接口中提供。 已被.Net圈内多家大厂采用! IDataA

C#开源、简单易用的Dapper扩展类库 - Dommel

前言 今天大姚给大家分享一个C#开源(MIT License)、免费、简单易用的Dapper扩展类库,帮助.NET开发者使用Dapper的CRUD操作变得更简单:Dommel。 项目特性 Dommel 使用 IDbConnection 接口上的扩展方法为 CRUD 操作提供了便捷的 API。 Dom

[转帖]Dapper,大规模分布式系统的跟踪系统

http://bigbully.github.io/Dapper-translation/ 作者:Benjamin H. Sigelman, Luiz Andr´e Barroso, Mike Burrows, Pat Stephenson, Manoj Plakal, Donald Beaver,

OpenTelemetry 深度定制:跨服务追踪的实战技巧

背景 在上一篇《从 Dapper 到 OpenTelemetry:分布式追踪的演进之旅》中在最后提到在做一些 Trace 的定制开发。 到现在差不多算是完成了,可以和大家分享一下。 我们的需求是这样的: 假设现在有三个服务:ServiceA、ServiceB、ServiceC ServiceA 对外

.NET 入门到高级路线

.NET Web入门到高级路线 C# 基础语法 .NET Core 基础知识 ASP.NET Core基础知识概述 Blazor ASP.NET Core 官方文档 ORM FreeSql EntityFrameworkCore Dapper SqlSugar 关系型数据库 SQL Server M

.NET Web入门到高级路线(新版本)

.NET Web入门到高级路线 C# 基础语法 .NET Core 基础知识 ASP.NET Core基础知识概述 Blazor ASP.NET Core 官方文档 ORM FreeSql EntityFrameworkCore Dapper SqlSugar 关系型数据库 SQL Server M